zoukankan      html  css  js  c++  java
  • 最大的位或 HDU

    题目描述

    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
    ",aa|bb);
        }
        return 0;
    }
    
  • 相关阅读:
    abs() 与fabs() 的区别辨析
    TCP服务端如何判断客户端断开连接学习
    数据结构与算法李春葆 第二章思维导图
    数据结构与算法思维导图第一章
    关于临时表的操作
    关于 ANSI_NULLS和QUOTED_IDENTIFIER
    临时表和视图的区别
    关于CancellationToken的解释
    在项目中添加signalr.js
    数据库存储过程的写法
  • 原文地址:https://www.cnblogs.com/liuchanglc/p/12828580.html
Copyright © 2011-2022 走看看