博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
UVA 10718 Bit Mask
阅读量:6956 次
发布时间:2019-06-27

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

UVA_10718

    为了使最后or运算的值最大,我们不妨从二进制位的最高位开始依次考虑。如果该位是0的话,我们应该尽量让其变成1,这时我们就可以依据我们的意图算出M可能的最小值和最大值,如果这个区间和L、U这个区间有交集的话,就说明我们是可以把这一位变成1的。同理,如果该位是1的话,无论M的这位是什么,最后这位还是为1,但为了让M尽量小,我们应该尽可能让这一位为0。当然,这时你是否会怀疑这样一个问题,如果这位为0的话,相比为1就会让整体的可能值变小了,会不会后面有1位是0而我们即便该位选1都达不到下限呢?这个是不会的,因为如果该位选1都达不到下限就说明后面全部是1都达不到下限,那么只能说明在上一步的选择的时候就已经违背了规则,这样就矛盾了,所以不会出现这种情况。

#include
#include
long long int N, L, R, d[64]; int a[64]; void prepare() {
int i; d[0] = 1; for(i = 1; i <= 32; i ++) d[i] = d[i - 1] * 2; } void solve() {
int i, j, k; long long int x, y, ans = 0; for(i = 0; i < 32; i ++) {
a[i] = N % 2; N /= 2; } for(i = 31; i >= 0; i --) {
if(a[i] == 0) {
x = ans + d[i]; y = ans + d[i + 1] - 1; if(x <= R && y >= L) ans += d[i]; } else {
x = ans; y = ans + d[i] - 1; if(x > R || y < L) ans += d[i]; } } printf("%lld\n", ans); } int main() {
prepare(); while(scanf("%lld%lld%lld", &N, &L, & R) == 3) {
solve(); } return 0; }

转载地址:http://ynmil.baihongyu.com/

你可能感兴趣的文章
scponly 密钥无密码scp登录
查看>>
重置otrs登录密码
查看>>
CentOS下搭建SVN服务器
查看>>
#15、#16 网络的基本构成与网络的几协议
查看>>
视频客户端电脑版去广告补丁V 1.0
查看>>
HTTP 499 状态码 nginx下 499错误
查看>>
shell 九九乘法表
查看>>
接口调用-http和https
查看>>
undo backup optimization does not work on 11.2.0.1?
查看>>
F5 的SNAT的irules相关配置
查看>>
安装redis(3.2.9)
查看>>
shell脚本之一
查看>>
oracle 12c 关闭统计信息收集和启用统计信息收集
查看>>
修复微商城提交购物车时部分手机号码不识别
查看>>
基于 HTML5 Canvas 的 3D 模型列表贴图
查看>>
ORA-00000 这是什么报错!
查看>>
lvs-dr简单配置
查看>>
hadoop配置lzo
查看>>
脚本调试:一次换行符导致的报错
查看>>
mysql 之 主从同步(单向同步和双向同步)
查看>>