zoukankan      html  css  js  c++  java
  • 【贪心算法】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;
    }
    
  • 相关阅读:
    ObjectiveC分类
    显示时间格式
    js模拟签名
    安装卸载homebrew
    NSFastEnumeration
    拼接音频
    在Orchard模块中访问模块本地的AppSettings
    重装证书
    msysgit中文问题
    Apple Push Notification service
  • 原文地址:https://www.cnblogs.com/Midoria7/p/12830211.html
Copyright © 2011-2022 走看看