UVA11384(I - Help is needed for Dexter )

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

猜你喜欢

转载自blog.csdn.net/qq_41658955/article/details/87731719
今日推荐