码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2016-11-18 22:37:15      阅读:623      评论:0      收藏:0      [点我收藏+]

标签:codeforce   位置   tar   sim   lock   code   ima   discuss   esc   

最大的位或

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 最大的位或 【贪心】 (2016年中国大学生程序设计竞赛(合肥))

标签:codeforce   位置   tar   sim   lock   code   ima   discuss   esc   

原文地址:http://www.cnblogs.com/Coolxxx/p/6078980.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!