HDU 5969 最大的位或 贪心 (中国大学生程序设计竞赛(合肥))

Posted Coolxxx

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU 5969 最大的位或 贪心 (中国大学生程序设计竞赛(合肥))相关的知识,希望对你有一定的参考价值。

最大的位或

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)



Problem Description
B君和G君聊天的时候想到了如下的问题。
给定自然数l和r ,选取2个整数x,y满足l <= x <= y <= r ,使得x|y最大。
其中|表示按位或,即C、 C++、 Java中的|运算。
 

 

Input
包含至多10001组测试数据。
第一行有一个正整数,表示数据的组数。
接下来每一行表示一组数据,包含两个整数l,r。
保证 0 <= l <= r <= 1018
 

 

Output
对于每组数据输出一行,表示最大的位或。
 

 

Sample Input
5 1 10 0 1 1023 1024 233 322 1000000000000000000 1000000000000000000
 

 

Sample Output
15 1 2047 511 1000000000000000000
 

 

Source
 

 

Recommend
jiangzijing2015   |   We have carefully selected several similar problems for you:  5981 5980 5979 5978 5977 
 

 

Statistic | Submit | Discuss | Note

 

题目链接:

  http://acm.hdu.edu.cn/showproblem.php?pid=5969

题目大意:

  给定自然数l和r ,选取2个整数x,y满足l <= x <= y <= r ,使得x|y最大。

题目思路:

  【贪心】

  将l和r化为61位2进制数,取x=l,从最高位开始往下,找到第一个l和r对应位置上的数不相等的(r上为1,l上为0,因为l<=r)。

  这时只要把r这一位改成0,并把这一位后面的所有数字全改为1,作为y,即可满足l<=x<=y<=r,且从不相等的位置往后全是1使得答案最大。

 

 1 #include <bits/stdc++.h>
 2 #define N 104
 3 #define M 61
 4 using namespace std;
 5 typedef long long LL;
 6 int cas;
 7 LL l,r;
 8 int a[N],b[N];
 9 int main()
10 {
11     int i;
12 //    freopen("1.txt","r",stdin);
13     for(scanf("%d",&cas);cas;cas--)
14     {
15         scanf("%lld%lld",&l,&r);
16         for(i=M;i>=0;i--)
17         {
18             LL c=1;
19             c<<=i;
20             if(c&l)a[i]=1;
21             else a[i]=0;
22             if(c&r)b[i]=1;
23             else b[i]=0;
24         }
25         LL ans=0;
26         for(i=M;i>=0;i--)
27         {
28             if(a[i]==b[i])
29             {
30                 LL c=1;
31                 c<<=i;
32                 ans+=c*a[i];
33             }
34             else break;
35         }
36         for(;i>=0;i--)
37         {
38             LL c=1;
39             c<<=i;
40             ans+=c;
41         }
42         printf("%lld\\n",ans);
43     }
44     return 0;
45 }
View Code

 

以上是关于HDU 5969 最大的位或 贪心 (中国大学生程序设计竞赛(合肥))的主要内容,如果未能解决你的问题,请参考以下文章

HDU 5969 最大的位或 (思维,贪心)

随手练——HDU-5969 最大的位或 (贪心)

hdu 5969 最大的位或

中国大学生程序设计竞赛(合肥)-重现赛1009 HDU 5969

最大的位或 HDU - 5969

[HDU5969] 最大的位或