HDU 5969 最大的位或

 

题意:给定一个区间,在这个区间内找到两个数,使得他们的位或值最大。

思路分析:我们可以从二进制的角度来思考这个问题,我们有了一个区间,那么我们最终答案的二进制的位数也就有了限制,那么我们想要做的就一定是尽可能地把这些二进制位全部变成1。由于我们一共选两个数位或取最大值,区间最大值是一定要选的,因为只有这样我们后续需要填的1才能尽可能小,落在区间内。之后就是将另一个数一位一位的拆开,再分别和答案进行计算,由于有区间的限制,我们在位或一位时先将它和左区间进行位或,看是不是小于右区间,再将该位和答案进行计算。

代码:

 

 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<cstring>
 4 #include<vector>
 5 using namespace std;
 6 typedef long long ll;
 7 const int N=1e6+10;
 8 int main(){
 9     int n;
10     scanf("%d",&n);
11     while(n--){
12         ll a,b;
13         scanf("%lld%lld",&a,&b);
14         ll ans=b;//先取最大值 
15         for(int i=0;((1ll<<i)|a)<=b;++i){//判断是否在区间内  
16             ans|=(1ll<<i);//将该位位或 
17         }
18         printf("%lld\n",ans);
19     }
20     return 0;
21 } 
View Code

 

posted @ 2020-05-07 11:49  19502-李嘉豪  阅读(129)  评论(0编辑  收藏  举报