题目大意:
目录
给你一个特定的数字,你有两个操作,分别是自增和乘2,问最小要多少次操作变成2^20的倍数。
分析 :
可以知道最小操作数内,子弹数量为4e520,不可能用完。如果某个数x是2^20的倍数,那么在它的二进制表示下,lowbit(x) 一定大于等于 1<<20 , 于是题目就变成了用最小的操作数,构造 lowbit(x) 大于等于 1 << 20 , 也就是说操作数一定小于等于20。
在自增的时候,可能构造出用更少操作数符合题意的 lowbit(x), 而且越早自增, 越容易把低位的1往高位送,于是代码实现如下。
代码:
#include <bits/stdc++.h>
using namespace std;
const int m = 1<<20; //贪心法
void solve(){
int n;
cin >> n;
int res = 20;
for (int i = 0; i <= 20; ++ i){
int val = (n+i)%m;
if (!val) res = min(res, i);
else {
int num = 0;
while (!(val&1)) val /= 2, ++ num;
res = min(res, (20-num)+i);
}
}
cout << res << "\n";
}
int main(){
int T;
cin >> T;
while (T--)
solve();
return 0;
}
大一在校,第一篇补题博客,简单的思维题。