nitacm20317 来自张司机的挑战书

题目:让你求从x到y中(1<=x<=y<=10^18),二进制一的个数最多的数是哪个,如果有多个相同的答案,输出最小的。

题目链接:https://www.nitacm.com/problem_show.php?pid=20317

 

类似题目及题解:https://www.cnblogs.com/myrtle/p/11662171.html

分析:先把x和y转换成二进制位:

(假设x,y最高位不是同一位):则答案可以取11111

(如果LR最高位相同):则最高位的数一定取,然后比较减去最高位后,剩下的数

特判:y的二进制全是1时,答案为y。

注意:&运算优先级低于==,需要加括号

#include<bits/stdc++.h>
using namespace std;
int cal2(long long n)//计算二进制有几个1 
{
    int cnt=0;
    for(int i=62;i>=0;i--)
    {
        long long tmp=1ll<<i;
        if(n>=tmp)n-=tmp,cnt++;
    }
    return cnt;
}

long long cal(long long x,long long y)
{
    for(int i=62;i>=0;i--)
    {
        long long tmp=1ll<<i; 
        if((tmp&y)==tmp)//最高位 
        {
            if((tmp&x)==(tmp&y))//最高位相等 
            {
                return tmp+cal(x-tmp,y-tmp);
            }
            else//最高位不相等 
            {
                long long ans=0;
                for(int j=i-1;j>=0;j--)
                {
                    ans+=(1ll<<j);
                }
                return ans;
            }
        }
    }
    return 0;
}
int main()
{
    int T;
    long long x,y;
    cin>>T;
    while(T--)
    {
        cin>>x>>y;
        long long ans=cal(x,y);
        if(cal2(y)>cal2(ans))ans=y;
        cout<<ans<<endl;
    }
    return 0;
} 
posted @ 2019-11-28 21:16  myrtle  阅读(217)  评论(0编辑  收藏  举报