AC代码如下:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e3+10;
int n,top;
int main()
{
while(~scanf("%d",&n))
{
top = 31;
while((n>>top) == 0)
top--;
printf("%d\n",top+1);
}
return 0;
}
【我的思路】首先我根据数据范围1~1e9和多组输入判断:不是O(n)的复杂度
其次,我觉得应当是O(1)的复杂度的程序即:输出一个公式
最开始我尝试过(猜测)n/2+1和(int)sqrt(n)+1
最终尝试的是最高二进制位位数+1
【正解思路】
最开始n/2+1的时候我的思路是:
1,2,3...n/2...n这个数列,每次可以消去两个:由于n/2...n中间的数据全都可以转化为n/2加上1...n/2之间的数字
因此每次消去两个,最后转化为一半0另一半n/2直接一步消去
根据这个我猜了一下答案是上述程序,结果AC啦!
【思考】根据这个思想进行细分,最终感觉可能是根据二进制位进行消除(相当于下面的程序,虽然不知道怎么来的)
扫描二维码关注公众号,回复:
5279193 查看本文章
int dfs(int n)
{
if(n == 0)
return 0;
else
return 1+dfs(n/2);
}
相当于提供了一个思考题目的方向吧:向二进制考虑
推荐博客:https://blog.csdn.net/zy691357966/article/details/40083163