博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
uva-10718-贪心
阅读量:6574 次
发布时间:2019-06-24

本文共 1504 字,大约阅读时间需要 5 分钟。

题意:输入unsigned int N,L,U,找出一个M(L<=M<=U)使得N | M最大,如果有多个M使得N | M最大,取最小的M,

解题思路:贪心,从最高位开始,判断是否应该置为0还是置为1,如果置0,那么一定要判断当前的ans加上剩下的数是否还在[L,U]之间.

如果不在,一定要置1.

#include "pch.h"#include 
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
namespace cc{ using std::cout; using std::endl; using std::cin; using std::map; using std::vector; using std::string; using std::sort; using std::priority_queue; using std::greater; using std::vector; using std::swap; using std::stack; using std::bitset; unsigned int N, L, U; unsigned int a[32]; void init() { for (int i=0;i<32;i++) { a[i] = (1 << i) - 1; } } int findMaxBit(unsigned U) { int max = 0; int i = 0; while (i < 32) { if ((U >> i) & 1) max = i; ++i; } return max; } void solve() { init(); while (cin>>N>>L>>U) { unsigned int ans = 0; unsigned int curMax = N; int mb = findMaxBit(U); while (mb+1) { unsigned int cur = 1 << mb; if ((cur & N) == cur) { //same 1 //check is need this bit to 1 if ((ans | a[mb]) < L && (ans|cur) <= U) { ans = ans | cur; } } else { //N的这位为0 if ((ans | cur) <= U) { ans = ans | cur; } } --mb; } cout << ans << endl; } }};int main(){#ifndef ONLINE_JUDGE freopen("d://1.text", "r", stdin);#endif // !ONLINE_JUDGE cc::solve(); return 0;}

 

posted on
2019-01-01 23:55 阅读(
...) 评论(
...)

转载于:https://www.cnblogs.com/shuiyonglewodezzzzz/p/10206650.html

你可能感兴趣的文章
PHP 时间操作 / 跳转问题
查看>>
Windows 2012 R2 FSMO角色相关小记录
查看>>
(小蚂蚁站长吧)网站优化做好这八步你就是seo第一
查看>>
使用流的方式往页面前台输出图片
查看>>
java核心技术反射
查看>>
我的友情链接
查看>>
Maven创建新的依赖项目
查看>>
2015年10月26日作业
查看>>
LAMP,安装脚本
查看>>
Java异常总结
查看>>
DHCP
查看>>
电脑上怎样压缩图片大小
查看>>
新来的发一个帖子
查看>>
Nginx 支持webSocket 响应403
查看>>
lnmp安装
查看>>
FTP工作方式
查看>>
Linux文件和目录管理常用命令(中)
查看>>
Ubuntu16.04 ssh安及root登录
查看>>
C语言dos程序源代码分享(进制转换器)
查看>>
php项目中常用的log日志记录方法
查看>>