题意:给你一个非负整数范围,求其中二进制中 1 最多且数字最小的数
解题思路:乱搞,找到两个数第一个不匹配的位数,将后面的位都赋值为1(如果右端点这位本身就是1,则从这一位开始),
解题代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 long 24 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 ",ans); 55 } 56 return 0; 57 }