题解 CF1152B 【Neko Performs Cat Furrier Transform】

ljc20020730

2019-04-26 18:54:02

Solution

事实上A操作的意图是将数字的末若干位取反。B操作含义是将数最后一位+1,并且进位。 考虑一个贪心,如果每次取将第一个0出现的位置往低位取反,然后最后在末尾+1,那么每次至少消去第一个0出现的位置的一个0 所以必然2步就可以至少删去1个0,那么显然可以在40步内完成任务。   本题主要需要注意,操作步数不一定是偶数,可能最后的B操作不做,操作步数是奇数的,需要特判。 ``` # include <bits/stdc++.h> using namespace std; int base[25]; int ttt[100]; int getbit(int x) { int t=x,cnt=0; while (t) t/=2,cnt++; return cnt; } bool check(int x) { for (int i=0;i<=20;i++) if (x==base[i]) return 1; return 0; } int main() { int uuu=0; int x,ans=0; scanf("%d",&x); for (int i=0;i<=20;i++) base[i]=(1<<i)-1; if (check(x)) { puts("0"); return 0; } while (true) { int p=getbit(x); bool flag=false; for (int i=p-2;i>=0;i--) if (((1<<i)&x)==0) { x=x^((1<<(i+1))-1); ttt[++ttt[0]]=i+1; uuu++; if (check(x)) flag=true; if (flag) break; x=x+1; uuu++; if (check(x)) flag=true; if (flag) break; break; } if (flag) break; } printf("%d\n",uuu); for (int i=1;i<=ttt[0];i++) printf("%d ",ttt[i]); return 0; } ```