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

 1 #include<stdio.h>
 2 typedef long long ll;
 3 ll fd(ll a,ll b)
 4 {
 5     ll i;
 6     for(i=1;i<=b+1;i*=2);
 7     i/=2;//找出小于等于i的最大的2的幂次
 8     if(a<i)
 9         return i-1;
10     else
11         return fd(a-i,b-i)+i;//拆出最高位的1,然后寻找其余低位上的最大符合题意的值
12 }
13 int main(){
14     int T,t;
15     ll a,b;
16     scanf("%d",&T);
17     for(t=0;t<T;t++)
18     {
19         scanf("%lld%lld",&a,&b);
20         printf("%lld\n",fd(a,b));
21     }
22     
23     return 0;
24 }

猜你喜欢

转载自www.cnblogs.com/stelayuri/p/12236276.html