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
  • 相关阅读:
    对deferred(延迟对象)的理解
    string 、char* 、 char []的转换
    char* 和 cha[]
    层序遍历二叉树
    之字形打印二叉树
    右值
    函数指针(待修改)
    top k

    哈夫曼编码
  • 原文地址:https://www.cnblogs.com/myrtle/p/11662171.html
Copyright © 2011-2022 走看看