首页 > 其他 > 详细

最大的位或 HDU - 5969 简单思维题

时间:2020-05-04 23:23:19      阅读:86      评论:0      收藏:0      [点我收藏+]

题目描述

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

Input

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

Output

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

样例

Sample Input

5
1 10
0 1
1023 1024
233 322
1000000000000000000 1000000000000000000

Sample Output

15
1
2047
511
1000000000000000000

分析

很简单的一个贪心,要想异或和最大,显然尽可能让每一位上的数字都为1,我们就从较小的数开始枚举,从最低位开始,将不为1的数位逐个变为1,当aa大于等于bb时跳出循环,输出aa|bb就可以了,十多行代码就可以解决问题

要注意两个坑:

1、位运算默认的是int,要强制类型转换乘long long,否则会aa的值会变为-1,死循环,就会T掉

2、最后要输出aa|bb,不能输出aa,比如0 1这组数据

代码

#include<cstdio>
using namespace std;
typedef long long ll;
int main(){
    ll aa,bb,t;
    scanf("%lld",&t);
    while(t--){
        scanf("%lld%lld",&aa,&bb);
        ll now=0;
        while((aa|((long long)1<<now))<bb) aa|=((long long)1<<now),now++;
        printf("%lld\n",aa|bb);
    }
    return 0;
}

最大的位或 HDU - 5969 简单思维题

原文:https://www.cnblogs.com/liuchanglc/p/12828580.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!