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

最大的位或

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 18    Accepted Submission(s): 17

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

2016年中国大学生程序设计竞赛(合肥)-重现赛(感谢安徽大学)

题意:中文题面

题解:被选择的两个数中,其中的一个数一定是区间的上界,寻找另一个数 初始全部为1 从高位到低位模拟。

  1 #include<iostream>
  2 #include<cstdio>
  3 #define ll __int64
  4 using namespace std;
  5 ll l,r;
  6 int t;
  7 int s1[70];
  8 int s2[70];
  9 int s3[70];
 10 int len=0;
 11 int len1=0;
 12 bool cmp1( int * ss,int *tt)
 13 {
 14     for(int i=len-1; i>=0; i--)
 15     {
 16         if(ss[i]==tt[i])
 17             continue;
 18         if(ss[i]>tt[i])
 19             return true;
 20         if(ss[i]<tt[i])
 21             return false;
 22     }
 23     return true;
 24 }
 25 bool cmp2( int * ss,int *tt)
 26 {
 27     for(int i=len-1; i>=0; i--)
 28     {
 29         if(ss[i]==tt[i])
 30             continue;
 31         if(ss[i]>tt[i])
 32             return false;
 33         if(ss[i]<tt[i])
 34             return true;
 35     }
 36     return true;
 37 }
 38 void ans()
 39 {
 40     for(int i=len-1; i>=0; i--)
 41     {
 42         if(s2[i]==1||s1[i]==1)
 43             s1[i]=1;
 44     }
 45     ll exm=1;
 46     ll re=0;
 47     for(int i=0; i<=len-1; i++)
 48     {
 49         if(s1[i])
 50             re+=exm;
 51         exm*=2;
 52     }
 53     cout<<re<<endl;
 54 }
 55 int main()
 56 {
 57     scanf("%d",&t);
 58     for(int i=1; i<=t; i++)
 59     {
 60         int flag=0;
 61         len=0;
 62         len1=0;
 63         scanf("%I64d %I64d",&l,&r);
 64         ll zha=r;
 65         while(r>0)
 66         {
 67             if(r&1)
 68                 s1[len++]=1;
 69             else
 70                 s1[len++]=0;
 71             r>>=1;
 72         }
 73         for(int j=0; j<len; j++)
 74         {
 75             s2[j]=1;
 76             s3[j]=0;
 77         }
 78         while(l>0)
 79         {
 80             if(l&1)
 81                 s3[len1++]=1;
 82             else
 83                 s3[len1++]=0;
 84             l>>=1;
 85         }
 86         for(int j=len-1; j>=0; j--)
 87         {
 88             if(s1[j]==1)
 89                 continue;
 90             if(s1[j]==0)
 91             {
 92                 s2[j+1]=0;
 93                 if(cmp1(s2,s3)&&cmp2(s2,s1))
 94                 {
 95                     ans();
 96                     flag=1;
 97                     break;
 98                 }
 99                 else
100                 {
101                     s2[j+1]=s1[j+1];
102                     s2[j]=s1[j];
103                 }
104             }
105         }
106         if(flag==0)
107             cout<<zha<<endl;
108     }
109     return 0;
110 }
时间: 2024-11-09 04:31:42

2016年中国大学生程序设计竞赛(合肥)-重现赛1009 HDU 5969的相关文章

2016年中国大学生程序设计竞赛(合肥)-重现赛1008 HDU 5968

异或密码 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 19    Accepted Submission(s): 9 Problem Description 晨晨在纸上写了一个长度为N的非负整数序列{ai }.对于这个序列的一个连续子序列{al,al+1,…,ar }晨晨可以求出其中所有数异或的结果 alxoral+1xor...xo

2016年中国大学生程序设计竞赛(合肥)-重现赛1001 HDU 5961

传递 Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 42    Accepted Submission(s): 16 Problem Description 我们称一个有向图G是传递的,当且仅当对任意三个不同的顶点a,,若G中有 一条边从a到b且有一条边从b到c ,则G中同样有一条边从a到c.我们称图G是一个竞赛图,当且仅当它是一个有

HDU 5961 传递 【图论+拓扑】 (2016年中国大学生程序设计竞赛(合肥))

传递 Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)   Problem Description 我们称一个有向图G是传递的,当且仅当对任意三个不同的顶点a,,若G中有 一条边从a到b且有一条边从b到c ,则G中同样有一条边从a到c.我们称图G是一个竞赛图,当且仅当它是一个有向图且它的基图是完全图.换句 话说,将完全图每条边定向将得到一个竞赛图.下图展示的是一个有4个顶点的竞

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

最大的位或 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组测试数据.第一行有一个正整数,表示数据的组数.接下

HDU 5965 扫雷 【模拟】 (2016年中国大学生程序设计竞赛(合肥))

扫雷 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 998    Accepted Submission(s): 289 Problem Description 扫雷游戏是晨晨和小璐特别喜欢的智力游戏,她俩最近沉迷其中无法自拔.该游戏的界面是一个矩阵,矩阵中有些格子中有一个地雷,其余格子中没有地雷. 游戏中,格子可能处于己知和未知的状态

HDU 5963 朋友 【博弈论】 (2016年中国大学生程序设计竞赛(合肥))

朋友 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Problem Description B君在围观一群男生和一群女生玩游戏,具体来说游戏是这样的:给出一棵n个节点的树,这棵树的每条边有一个权值,这个权值只可能是0或1. 在一局游戏开始时,会确定一个节点作为根.接下来从女生开始,双方轮流进行 操作.当一方操作时,他们需要先选择一个不为根的点,满足该点到其父亲的边权为1; 然

HDU 5968 异或密码 【模拟】 2016年中国大学生程序设计竞赛(合肥)

异或密码 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Problem Description 晨晨在纸上写了一个长度为N的非负整数序列{ai}.对于这个序列的一个连续子序列{al,al+1,-,ar}晨晨可以求出其中所有数异或的结果 alxoral+1xor...xorar其 中xor表示位异或运算,对应C.C++. Java等语言中的^运算.小璐提出了M个询问,每个询问用

2016年中国大学生程序设计竞赛(杭州)1006 Four Operations

Four Operations Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 38    Accepted Submission(s): 18 Problem Description Little Ruins is a studious boy, recently he learned the four operations! Now

HDU 5943 Kingdom of Obsession 【二分图匹配 匈牙利算法】 (2016年中国大学生程序设计竞赛(杭州))

Kingdom of Obsession Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 49    Accepted Submission(s): 14 Problem Description There is a kindom of obsession, so people in this kingdom do things very