待修改 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;
}
posted @ 2014-06-23 20:16  hansongjiang8  阅读(101)  评论(2编辑  收藏  举报