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

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=5969

    题意:给定自然数l和r ,选取2个整数x,y,满足l <= x <= y <= r,使得x|y最大。

    分析:先把l和r转换成二进制位,举个栗子:

    (假设LR最高位不是同一位):

    x、y可以取二进制的11111(一定在L和R范围内的一个数)和100101(R),所以结果是11111或上100101即111111(63)

    (如果LR最高位相同):

    那就L和R都减去8,转换成L=01,R=001来看,此时x可以取11,y可以取001,所以x|y=111,再加上之前的8,答案是1111(15)

    两种并在一起考虑:找出L、R找前面最大的相同位数,不同的地方开始,全部补1。

    #include<bits/stdc++.h>
    using namespace std;
    int main()
    {
        int T;
        scanf("%d",&T);
        while(T--)
        {
            long long a,b,res=0;
            scanf("%lld%lld",&a,&b);
            for(int i=63;i>=0;i--)
            {
                if(((1LL<<i)&a)==((1LL<<i)&b))continue;
                else
                {
                    for(int j=i;j>=0;j--)
                    {
                        res|=(1LL<<j); 
                    }
                    res|=a;
                    break;
                }
            }
            res|=a;
            printf("%lld
    ",res);
        }
        return 0; 
    } 
    View Code
  • 相关阅读:
    Day10
    Day9
    Day8
    Day 7
    Day-6
    java中的原子性
    java 原子性
    内存可见性
    JVM 常忘笔记
    JVM 解释执行 编译执行 JIT
  • 原文地址:https://www.cnblogs.com/myrtle/p/11662171.html
Copyright © 2011-2022 走看看