首页 > 代码库 > Codeforces 484(#276 Div 1) A Bits 乱搞

Codeforces 484(#276 Div 1) A Bits 乱搞

题意:给你一个非负整数范围,求其中二进制中 1 最多且数字最小的数

解题思路:乱搞,找到两个数第一个不匹配的位数,将后面的位都赋值为1(如果右端点这位本身就是1,则从这一位开始),

解题代码:

 1 // Author: darkdream 2 // Created Time: 2014年11月06日 星期四 00时24分10秒 3  4 #include<vector> 5 #include<list> 6 #include<map> 7 #include<set> 8 #include<deque> 9 #include<stack>10 #include<bitset>11 #include<algorithm>12 #include<functional>13 #include<numeric>14 #include<utility>15 #include<sstream>16 #include<iostream>17 #include<iomanip>18 #include<cstdio>19 #include<cmath>20 #include<cstdlib>21 #include<cstring>22 #include<ctime>23 #define LL long long24 25 using namespace std;26 int main(){27     int n ;28     LL l , r;29     scanf("%d",&n);30     for(int i = 1;i <= n;i ++)31     {32         LL ans = 0 ; 33         scanf("%I64d %I64d",&l,&r);34         for(int i = 62 ;i >= 0 ;i --)35         {36             if((r&(1ll << i)) != 0 )37             {38                 if((l & (1ll << i)) != 0 )39                 {40                     ans += (1ll << i);41                     r &=  (~(1ll << i));42                     l &=  (~(1ll << i));43                 }else{44                     if((1ll << (i+1))-1 <= r)45                     {46                         ans +=  (1ll << (i+1)) -1;47                     }48                     else ans += (1ll << i ) - 1; 49                     break;50                 }51             }52 53         }54         printf("%I64d\n",ans);55     }56     return 0;57 }
View Code

 

Codeforces 484(#276 Div 1) A Bits 乱搞