您的位置:首页 > 其它

2016年中国大学生程序设计竞赛(合肥)-重现赛1009 HDU 5969

2016-11-05 18:09 405 查看

最大的位或

Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 18 Accepted Submission(s): 17


[align=left]Problem Description[/align]
B君和G君聊天的时候想到了如下的问题。
给定自然数l和r ,选取2个整数x,y满足l <= x <= y <= r ,使得x|y最大。
其中|表示按位或,即C、 C++、 Java中的|运算。

[align=left]Input[/align]
包含至多10001组测试数据。
第一行有一个正整数,表示数据的组数。
接下来每一行表示一组数据,包含两个整数l,r。
保证 0 <= l <= r <= 1018



[align=left]Output[/align]
对于每组数据输出一行,表示最大的位或。

[align=left]Sample Input[/align]

5

1 10

0 1

1023 1024

233 322

1000000000000000000
1000000000000000000

[align=left]Sample Output[/align]

15

1

2047

511

1000000000000000000

[align=left]Source[/align]
2016年中国大学生程序设计竞赛(合肥)-重现赛(感谢安徽大学)
题意:中文题面
题解:被选择的两个数中,其中的一个数一定是区间的上界,寻找另一个数 初始全部为1 从高位到低位模拟。

#include<iostream>
#include<cstdio>
#define ll __int64
using namespace std;
ll l,r;
int t;
int s1[70];
int s2[70];
int s3[70];
int len=0;
int len1=0;
bool cmp1( int * ss,int *tt)
{
for(int i=len-1; i>=0; i--)
{
if(ss[i]==tt[i])
continue;
if(ss[i]>tt[i])
return true;
if(ss[i]<tt[i])
return false;
}
return true;
}
bool cmp2( int * ss,int *tt)
{
for(int i=len-1; i>=0; i--)
{
if(ss[i]==tt[i])
continue;
if(ss[i]>tt[i])
return false;
if(ss[i]<tt[i])
return true;
}
return true;
}
void ans()
{
for(int i=len-1; i>=0; i--)
{
if(s2[i]==1||s1[i]==1)
s1[i]=1;
}
ll exm=1;
ll re=0;
for(int i=0; i<=len-1; i++)
{
if(s1[i])
re+=exm;
exm*=2;
}
cout<<re<<endl;
}
int main()
{
scanf("%d",&t);
for(int i=1; i<=t; i++)
{
int flag=0;
len=0;
len1=0;
scanf("%I64d %I64d",&l,&r);
ll zha=r;
while(r>0)
{
if(r&1)
s1[len++]=1;
else
s1[len++]=0;
r>>=1;
}
for(int j=0; j<len; j++)
{
s2[j]=1;
s3[j]=0;
}
while(l>0)
{
if(l&1)
s3[len1++]=1;
else
s3[len1++]=0;
l>>=1;
}
for(int j=len-1; j>=0; j--)
{
if(s1[j]==1)
continue;
if(s1[j]==0)
{
s2[j+1]=0;
if(cmp1(s2,s3)&&cmp2(s2,s1))
{
ans();
flag=1;
break;
}
else
{
s2[j+1]=s1[j+1];
s2[j]=s1[j];
}
}
}
if(flag==0)
cout<<zha<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐