测试的数据都正确啊,跟别人正确代码也对比了一下,一直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; }