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 }

时间: 2024-12-12 12:49:08

hdu 5969 最大的位或的相关文章

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 - 5969

·题目来源     ·借鉴   ·按位或 B君和G君聊天的时候想到了如下的问题. 给定自然数l和r ,选取2个整数x,y满足l <= x <= y <= r ,使得x|y最大. 其中|表示按位或,即C. C++. Java中的|运算. Input包含至多10001组测试数据. 第一行有一个正整数,表示数据的组数. 接下来每一行表示一组数据,包含两个整数l,r. 保证 0 <= l <= r <= 10181018.Output对于每组数据输出一行,表示最大的位或.Sam

HDU 5969

B君和G君聊天的时候想到了如下的问题. 给定自然数l和r ,选取2个整数x,y满足l <= x <= y <= r ,使得x|y最大. 其中|表示按位或,即C. C++. Java中的|运算. #include<stdio.h> #include<algorithm> #include<string.h> #include<math.h> #include<set> #include<string> using na

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++.

hdu 2844 poj 1742 Coins

hdu 2844 poj 1742 Coins 题目相同,但是时限不同,原本上面的多重背包我初始化为0,f[0] = 1;用位或进行优化,f[i]=1表示可以兑成i,0表示不能. 在poj上运行时间正好为时限3000ms....太慢了,hdu直接TLE(时限1s); 之 后发现其实并不是算法的问题,而是库函数的效率没有关注到.我是使用fill()按量初始化的,但是由于memset()可能是系统底层使用了四个字节拷 贝的函数(远比循环初始化快),效率要高得多..这就是为什么一直TLE的原因,fil

HDU 1166 敌兵布阵(线段树单点更新,板子题)

敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 87684    Accepted Submission(s): 36912 Problem Description C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任务

HDU 5938 Four Operations 【贪心】(2016年中国大学生程序设计竞赛(杭州))

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

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

HDU-5969:http://acm.hdu.edu.cn/showproblem.php?pid=5969 一开始也是分了类,觉得要两种情况,l 与 r 位数相同与不同的情况,仔细想一下,可以一起处理,从最高位(左侧符号位)开始,遇到不同后面全部补1即可. 刚写好交信心满满,一交就Wrong answer,写了一个暴力求 的对数器,确定算法是对的,也知道了问题在哪. 第一,数据相同时,没有结果,要处理. 第二,碰到不同后,将 r 后面的全部置1: r = r | (t << s); 一开始

HDU 6203 ping ping ping [LCA,贪心,DFS序,BIT(树状数组)]

题目链接:[http://acm.hdu.edu.cn/showproblem.php?pid=6203] 题意 :给出一棵树,如果(a,b)路径上有坏点,那么(a,b)之间不联通,给出一些不联通的点对,然后判断最少有多少个坏点. 题解 :求每个点对的LCA,然后根据LCA的深度排序.从LCA最深的点对开始,如果a或者b点已经有点被标记了,那么continue,否者标记(a,b)LCA的子树每个顶点加1. #include<Bits/stdc++.h> using namespace std;