待修改 nyoj 412 又是一个遗留问题

测试的数据都正确啊,跟别人正确代码也对比了一下,一直wrong ans,这道题是搞不定了,思路是这样的,一个int 的数,

例如 一个数的二进制是1001100,那么大于这个数的最小的有相同个数1的数是都少?

我的思路是这样:既然最小那么我就每次加一试试:,然后判断1个数是否相同,以上个数为例。

10011_01 10011_10 10011_11    到此为止,1的个数一直在增加

添加多少1呢? 添加在哪里呢?

10100—00 中1的位置,到 1001100中1的位置。为   5-3-1=1;

所以加一个1,最小当然添加在最后一位了。如果是2呢,则添加在最后两位。总之添加在最低位,

1010001

 

不细说了,同学们可以不断的加一观察很快就发现了。

ps:   x&-x表示最低位1的权值,具体讨论可以做一下树状数组。

 

 

#include<iostream>

#include<math.h>

//x&-x 为x的二进制中最低位1的权值 列: 110010为 2  11100为4 ,所以 log2(4)表示最低位1在第2位

using namespace std;

int lowbit(int n)

{

    return log(n&-n)/log(2);



}

int main()

{

    int n;

    while(cin>>n)

    {

        int pos1=lowbit(n);

        

        int n2=lowbit(n+n&-n);

        //cout<<"hello"<<pos1<<n2<<endl;

        int ne=n+(n&-n);

        

        int count=n2-pos1-1;

        int a=1;

        for(int i=0;i<count;i++)

        {

            ne+=a;

            a=a<<1;

        

        }

        cout<<ne<<endl;

    

    }

    





return 0;

}

你可能感兴趣的:(问题)