ZJNU 1699 - Bits

可得应当优先寻找最大的2^n-1这个数

如果l的位数不等于r的位数,那么这个数 2^n-1 就是最优解(每一位全为1)

如果l和r的位数相同,先看r是否符合 2^n-1,符合直接返回,不符合的话拆除最高位继续寻找

例如 l=10 r=14

即1010~1110 B

l和r位数相同且r不全为1

则可以拆除最高位1后

寻找10~110B中位数最大的最小数

位数不同,直接找到11B返回

则最终答案为1000B+11B=8+3=11

#include<stdio.h>
typedef long long ll;
ll fd(ll a,ll b)
{
    ll i;
    for(i=1;i<=b+1;i*=2);
    i/=2;//找出小于等于i的最大的2的幂次
    if(a<i)
        return i-1;
    else
        return fd(a-i,b-i)+i;//拆出最高位的1,然后寻找其余低位上的最大符合题意的值
}
int main(){
    int T,t;
    ll a,b;
    scanf("%d",&T);
    for(t=0;t<T;t++)
    {
        scanf("%lld%lld",&a,&b);
        printf("%lld\n",fd(a,b));
    }
    
    return 0;
}

 

posted @ 2020-01-27 16:27  StelaYuri  阅读(80)  评论(0编辑  收藏  举报