hdu5969

http://acm.hdu.edu.cn/showproblem.php?pid=5969
要使或的和最大,要尽可能的让高位为1。将l和r两个数的二进制形式写出来,缺的补0,每一位都对齐,由于l<=r,所以在不相等的情况下,一定会出现某一位,r这一位上是1,而l这一位上是0,这样,我们可以选择一个数x这一位是1,往后所有都是0,y这一位是0,往后所有都是1,这样选择的x,y一定满足要求,而且x|y最大。

#include <iostream>
#include <cmath>
#include <cstring>
using namespace std;

long long x,y,ans;
int xx[1000],yy[1000],zz[1000];
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        cin>>x>>y;
        if(x==y)
        {
            cout<<x<<endl;
            continue;
        }
        for(int i=0;i<64;i++)
        {
            xx[64-i-1]=x%2;
            x/=2;
            yy[64-i-1]=y%2;
            y/=2;
        }
        int pos;
        for(int i=0;i<64;i++)
        {
            if(xx[i]!=yy[i])
            {
                pos=i;
                break;
            }
        }
        for(int i=0;i<pos;i++)
        zz[i]=xx[i];
        for(int i=pos;i<64;i++)
        zz[i]=1;
        ans=0;
        for(int i=0;i<64;i++)
        ans=ans*2+zz[i];
        cout<<ans<<endl;
    }
    return 0;
}
    原文作者:B树
    原文地址: https://blog.csdn.net/aonaigayiximasi/article/details/53088488
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞