hdu 5969 最大的位或(贪心)
给定自然数l和r ,选取2个整数x,y满足l <= x <= y <= r ,使得x|y最大。
其中|表示按位或,即C、 C++、 Java中的|运算。
第一行有一个正整数,表示数据的组数。
接下来每一行表示一组数据,包含两个整数l,r。
保证 0 <= l <= r <= 1018。
题目是中文的题意就不解释了
大致还是贪心的思想,两个数异或有1就是1都是0才是0。
这题我们只要考虑两种情况就可以了。一种是当他们都化为二进制时,比较一下位数如果他们的位数相差1以上的话直接将所有位数都变成1。
第二种当他们位数相同时也是最难考虑的情况,从高位向低位遍历,遇到相同位为1的时候继续向下查找知道为1的位不相同时,将位小的为1
以后的全变成1。大致如何实现还是看代码,语言表达能力较差,不好解释。
#include <iostream>
#include <cstring>
#include <cmath>
using namespace std;
typedef long long ll;
int dig1[70] , dig2[70] ,dig3[70];
void Get(ll x , int dig[] , int &gg) {
int len = 0;
if(x == 0) {
len = 1;
}
while(x) {
dig[++len] = x % 2;
x >>= 1;
}
gg = len;
}
ll Pow(int x , int y) {
ll sum = 1;
for(int i = 1 ; i <= y ; i++) {
sum *= x;
}
return sum;
}
int main()
{
int t; cin >> t;
while(t--) {
ll l , r;
memset(dig1 , 0 , sizeof(dig1));
memset(dig2 , 0 , sizeof(dig2));
memset(dig3 , 0 , sizeof(dig3));
cin >> l >> r;
int len1 = 0 , len2 = 0;
Get(l , dig1 , len1);
Get(r , dig2 , len2);
if(len1 == len2) {
int temp1 = 0;
int temp2 = 0;
int flag = 0;
for(int i = len2 ; i >= 1 ; i--) {
if(dig2[i] == 1 && flag == 0) {
temp1 = i;
}
if(dig1[i] == 1) {
temp2 = i;
if(flag == 1)
break;
}
if(temp1 == temp2) {
;
}
else {
flag = 1;
temp2 = temp1 - 1;
}
}
if(temp1 == temp2) {
for(int i = len2 ; i >= 1 ; i--) {
dig3[i] = dig2[i];
}
}
else {
for(int i = len2 ; i >= 1 ; i--) {
if(i > temp1) {
dig3[i] = dig2[i];
}
else {
dig3[i] = 1;
}
}
}
}
if(len1 < len2) {
for(int i = len2 ; i >= 1 ; i--) {
dig3[i] = 1;
}
}
ll sum = 0;
for(int i = 1 ; i <= len2 ; i++) {
sum += Pow(2 , i - 1) * dig3[i];
}
cout << sum << endl;
}
return 0;
}
hdu 5969 最大的位或(贪心)的更多相关文章
- HDU 5969 最大的位或 —— 贪心 + 二进制的理解
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5969 最大的位或 Time Limit: 2000/1000 MS (Java/Others) ...
- HDU 5969 最大的位或 (思维,贪心)
HDU 5969 最大的位或 题目大意 B君和G君聊天的时候想到了如下的问题. 给定自然数\(l\)和\(r\) ,选取\(2\)个整数\(x,y\)满足\(l <= x <= y < ...
- HDU 5969 最大的位或 【贪心】 (2016年中国大学生程序设计竞赛(合肥))
最大的位或 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Problem De ...
- HDU 5969 最大的位或【贪心】
题目 B君和G君聊天的时候想到了如下的问题. 给定自然数l和r ,选取2个整数x,y满足l <= x <= y <= r ,使得x|y最大. 其中|表示按位或,即C. C++. Ja ...
- HDU 5969 最大的位或【贪心/按位或/思维】
链接 最大的位或 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total Subm ...
- 【贪心算法】HDU 5969 最大的位或
题目内容 Vjudge链接 给出一个闭区间,找该区间内两个数,使这两个数的按位或最大. 输入格式 包含至多\(10001\)组测试数据. 第一行有一个正整数,表示数据的组数. 接下来每一行表示一组数据 ...
- HDU - 5969 最大的位或 想法题
http://acm.hdu.edu.cn/showproblem.php?pid=5969 (合肥)区域赛签到题...orz 题意:给你l,r,求x|y的max,x,y满足l<=x<=y ...
- hdu 5969 最大的位或
最大的位或 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submi ...
- HDU 5969 最大的位或 题解
题目 B君和G君聊天的时候想到了如下的问题. 给定自然数l和r ,选取2个整数\(x,y\)满足\(l <= x <= y <= r\),使得\(x|y\)最大. 其中\(|\)表示 ...
随机推荐
- 我与微笑哥以及 Java 极客技术的前世今生
关注公众号,大家可以在公众号后台回复“博客园”,免费获得作者 Java 知识体系/面试必看资料. Hello,大家好,我是子悠,Java 极客技术团队的作者之一,本周是六月的第三周,将由我给大家编辑 ...
- Hadoop 系列(一)—— 分布式文件系统 HDFS
一.介绍 HDFS (Hadoop Distributed File System)是 Hadoop 下的分布式文件系统,具有高容错.高吞吐量等特性,可以部署在低成本的硬件上. 二.HDFS 设计原理 ...
- python_0基础学习_day02
第二节 一,while while也称为无限循环.死循环 while 条件: 缩进 循环体 应用领域:音乐播放:单曲循环,列表循环,随机播放(也是有规律的) 登陆界面:…… 数学计算:1~100的和, ...
- oracle RAC LOG_ARCHIVE_DEST_1 与 LOG_ARCHIVE_DEST 冲突解决
在做 oracle RAC 归档日志配置时,出现了一个错误,开始看资料的时候, 注意到了 LOG_ARCHIVE_DEST_n 与 LOG_ARCHIVE_DEST 不能同时使用, 但在配置的时候并没 ...
- 七天学会NodeJS——第一天
转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者.原文出处:http://nqdeng.github.io/7-days-nodejs Node.js 是一个能 ...
- 修改 jupyter notebook的默认文件夹位置
安装好Anaconda 3以后,就可以使用Jupyter notebook了,但是我们打开Jupyter notebook后,发现界面是一个默认的目录,这个目录在哪里?如果想把自己写的程序文件保存在自 ...
- Go标准库--net/http学习
Go中对网络的支持提供了标准库,net包提供了可移植的网络I/O接口,包括TCP/IP.UDP.域名解析和Unix域socket. http包提供了HTTP客户端和服务端的实现. 一般我们用http肯 ...
- Spark1——介绍
1.Spark是什么 Spark是一个用来实现快速而通用的集群计算的平台. 2.Spark是一个大一统的软件栈 Spark项目包含多个紧密集成的组件.首先Spark的核心是一个对由很多计算任务组成的. ...
- Excel批量导入(导出同理)
在做JavaWeb中添加数据使我们在所难免会遇到的,在大数据的环境下批量添加和批量删除是必须的,而批量删除只需要获取到我们需要删除的ID就可以了,在批量添加中我们就会遇到问题,问题是得到批量的数据,这 ...
- 01-WIN2012R2+SQL2016故障转移群集的搭建
一.前期准备 1.1.准备4台机器 机器名 IP 功能 jf-yukong 192.168.10.200 做域控服务器 Jf-storage 192.168.10.201 做ISCSI存储服务器 J ...