【贪心算法】HDU 5969 最大的位或

题目内容

Vjudge链接
给出一个闭区间,找该区间内两个数,使这两个数的按位或最大。

输入格式

包含至多(10001)组测试数据。
第一行有一个正整数,表示数据的组数。
接下来每一行表示一组数据,包含两个整数(l,r)
保证$ 0le lle rle 10^{18}$。

输出格式

对于每组数据输出一行,表示最大的位或。

样例输入

5
1 10
0 1
1023 1024
233 322
1000000000000000000 1000000000000000000

样例输出

15
1
2047
511
1000000000000000000

思路

使位或最大,就在范围内,使二进制数的1尽可能多就好了。最后求出1最多的数和右端点位或一下。
注意用位运算的时候要强制转long long。

代码

#include<cstdio>
using namespace std;
typedef long long ll;

int main(){
    int T;
    scanf("%d",&T);

    while(T--){
        ll a,b;
        scanf("%lld%lld",&a,&b);

        int pos=0;
        while((a|((ll)1<<pos))<=b){
            a|=((ll)1<<pos);
            pos++;
        }

        printf("%lld
",a|b);
    }
    return 0;
}
原文地址:https://www.cnblogs.com/Midoria7/p/12830211.html