hdu 5969 最大的位或

Posted happy_code

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hdu 5969 最大的位或相关的知识,希望对你有一定的参考价值。

最大的位或

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


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
 
 
 
//第一次做位运算有关的题目,贪心方案想了好久。。。
  1 #include <stdio.h>
  2 #include <string.h>
  3 
  4 typedef long long LL;
  5 
  6 LL l,r,Max;
  7 char bit_l[300];
  8 char bit_r[300];
  9 char temp[300];
 10 
 11 LL StrToNum(char s[])//二进制字符变数字
 12 {
 13     int len=strlen(s);
 14     LL ans=0,res=1;
 15     for (int i=len-1;i>=0;i--)
 16     {
 17         if (s[i]==\'1\')
 18             ans+=res;
 19         res*=2;
 20     }
 21     return ans;
 22 }
 23 
 24 void NumToStr(LL x)//数字变二进制字符串
 25 {
 26     if (x==0)
 27     {
 28         temp[0]=\'0\';
 29         temp[1]=\'\\0\';
 30         return ;
 31     }
 32     char s[300];
 33     int pos=0;
 34     while (x!=0)
 35     {
 36         int tt=x%2;
 37         if (tt==1)
 38             s[pos++]=\'1\';
 39         else if (tt==0)
 40             s[pos++]=\'0\';
 41         x/=2;
 42     }
 43     s[pos]=\'\\0\';
 44     int i;
 45     for (i=0;i<pos;i++)
 46         temp[i]=s[pos-1-i];
 47     temp[i]=\'\\0\';
 48 }
 49 
 50 int main()
 51 {
 52     int i,j,t;
 53     char test[300];
 54     scanf("%d",&t);
 55     while (t--)
 56     {
 57         Max=-100;
 58         scanf("%I64d%I64d",&l,&r);
 59         if (l==r)
 60         {
 61             printf("%lld\\n",l|r);
 62             continue;
 63         }
 64         NumToStr(l);
 65         strcpy(bit_l,temp);
 66         NumToStr(r);
 67         strcpy(bit_r,temp);
 68 
 69         strcpy(test,bit_r);
 70         int len_l=strlen(bit_l);
 71         int len_r=strlen(bit_r);
 72         for (i=0;i<len_r-len_l;i++)
 73         {
 74             test[i]=\'0\';
 75         }
 76         for (j=0;j<=len_l;j++)
 77         {
 78             test[i++]=bit_l[j];
 79         }
 80         strcpy(bit_l,test);
 81         for (i=0;i<len_r;i++)
 82         {
 83             if (bit_l[i]==\'1\'||bit_r[i]==\'1\')
 84                 test[i]=\'1\';
 85             else
 86                 test[i]=\'0\';
 87         }
 88         test[i]=\'\\0\';
 89         LL res;
 90         res=StrToNum(test);
 91         if (res>Max) Max=res;
 92         //printf("l : %s\\n",bit_l);
 93         //printf("r : %s\\n",bit_r);
 94         //printf("t : %s\\n",test);
 95         int k=0;
 96         while (bit_l[k]==bit_r[k]) k++;
 97         k++;
 98         for (i=k;i<len_r;i++)
 99         {
100             res=StrToNum(test);
101             if (res>Max) Max=res;
102             if (bit_l[i]==\'0\'&&bit_r[i]==\'0\')
103             {
104                 test[i]=\'1\';
105                 res=StrToNum(test);
106                 if (res>Max)
107                     Max=res;
108             }
109         }
110         printf("%I64d\\n",Max);
111     }
112     return 0;
113 }
View Code

 

以上是关于hdu 5969 最大的位或的主要内容,如果未能解决你的问题,请参考以下文章

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

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

最大的位或 HDU - 5969

[HDU5969] 最大的位或

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

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