5146: 最强单身狗

描述

有若干只单身狗排成一排,编号从 l 到 r。GBX 发现,一个单身狗的编号的二进制中 1 的数量越多,表示该单身狗越强(就是单身越久咯 -_-|||)。GBX 想找到一只最强的单身狗和他做朋友(强者惺惺相惜吧 >_<)。

 

输入

输入一个 T(T ≤ 1000)表示 T 组数据。

对于每组数据输入两个正整数 l,r(1 ≤ l ≤ r ≤ 1018 ),表示单身狗的标号。

 

输出

对于每组数据输出一个数表示最强的单身狗的标号(如果有多个输出最小的那个),每组数据占一行。

 

样例输入

样例输出

题目来源

华中师范大学 2016 年“计蒜客杯”第十四届程序设计竞赛

 

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 int t,jishu;
 5 ll a,b;
 6 int arr[65];
 7 int main()
 8 {
 9     cin>>t;
10     while(t--){
11         memset(arr,0,sizeof(arr));
12         jishu=0;
13         cin>>a>>b;
14         ll sum=a;
15         while(a){
16             arr[++jishu]=a&1;
17             a=a>>1;
18         }      //从低位开始改 如果的小的可以加那肯定加小的可以为后面提供更加大的空间 贪心
19         for(int i=1;i<=61;i++){  //从低位开始加上这个数
20             if(arr[i]==0&&sum+(1LL<<(i-1))<=b){   //1LL 转化为longlong防止溢出 从0开始
21                 sum+=(1LL<<(i-1));
22                 arr[i]=1;
23             }
24         }
25         cout << sum << endl;
26     }
27     return 0;
28 }
View Code

 

 

猜你喜欢

转载自www.cnblogs.com/qq-1585047819/p/10891055.html