您的位置:首页 > 其它

HDU 5969 最大的位或

2016-11-06 21:27 671 查看

最大的位或

开始这道题一直想着直接位运算去遍历,排除情况,但数据量还是很大,后来把两个数二进制所有位都分别放在两个bool型数组里,就简单多了,只需要考虑输入的那两个数从哪一位开始出现不同,小数也就是下界,其到上界之内一定会出现与下界位数相等并所有位数全1的数,所以以上界数为基础,存在一个数使它一段后缀或运算全为1。最后上界数变换完就是结果。例如:二进制100100101101和100101101011第六位发现不一样,所以在这之间必然有100100111111,然后就把后面上界数>6的位都变成1。

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
__int64 a,b;
bool A[65],B[65];
int main()
{
int t,i;
scanf("%d",&t);
while(t--)
{
scanf("%I64d%I64d",&a,&b);
int j=63;
for(i=1;i<=64;i++)
{
A[i]=(a>>j)%2;
B[i]=(b>>j)%2;
j--;
}

int I=64;
for(i=1;i<=64;i++)
{
if(A[i]!=B[i])
{
I=i;
break;
}
}
for(i=I+1;i<=64;i++)
B[i]=1;
__int64 sum=0;
for(i=1;i<=64;i++)
{
sum<<=1;
sum+=B[i];
}
printf("%I64d\n",sum);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: