LightOJ-1042-math

来源:互联网 发布:js mouseout 编辑:程序博客网 时间:2024/06/06 06:58

题目大意:给定一个数,求一个比它大的数,使得他们二进制一的个数相同并且那       个数要最小;


题目解析:考虑他的后缀肯定会出现011...1100...00的形式,我们需要做的就是把红色的0变成1,然后统计后面1的个数,设为n,去掉一个1,并且把所有1右移至顶端,最后形如100...00011...11的形式,注意如果所有字母都是1或者是11...1100...000的形式,要在最左端添加一个1;


AC代码:

#include<iostream>#include<cstdio>#include<algorithm>#include<cstring>#include<string>using namespace std;typedef long long ll;ll n,temp;int main(){int c,cas,i,posi,posj,flagi,flagj,cnt,flag,ans;scanf("%d",&cas);for(c=1;c<=cas;c++){scanf("%lld",&n);temp=n;posi=-1;flagi=0;posj=-1;flagj=0;cnt=0;flag=0;ans=0;while(n!=0){if(n%2==1){posi=cnt;flag=1;flagi=1;}if(n%2==0&&flagi==0){ans++;} if(n%2==0&&flagj==0&&flag==1){posj=cnt;flagj=1;}n/=2;if(flagi==1&&flagj==1)break;cnt++;}if(posj==-1)posj=cnt;printf("Case %d: %lld\n",c,temp+(1<<(ans))+(1<<(posj-ans-1))-1);}return 0;}


0 0
原创粉丝点击