博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
模拟+位运算 HDOJ 5491 The Next
阅读量:6673 次
发布时间:2019-06-25

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

 

题意:意思很简单,找一个最接近D且比D大的数,满足它的二进制表示下的1的个数在[S1, S2]之间

分析:从D + 1开始,若个数小于S1,那么从低位向高位把0替换成1直到S1就是最小值,否则往更大的数去找,此时目标是减少1的数量,可以优化, +lowbit (D),因为+小于lowbit (D)只会增加1的数量。这题比赛时队友想的很复杂,方法不够简单暴力。

 

/************************************************* Author        :Running_Time* Created Time  :2015/9/28 星期一 09:19:08* File Name     :H.cpp ************************************************/#include 
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;#define lson l, mid, rt << 1#define rson mid + 1, r, rt << 1 | 1typedef long long ll;const int N = 1e5 + 10;const int INF = 0x3f3f3f3f;const int MOD = 1e9 + 7;const double EPS = 1e-8;int b[64];int low_bit(int i) { return i & (-i);}int main(void) { int T, cas = 0; scanf ("%d", &T); while (T--) { int S1, S2; ll D; scanf ("%I64d%d%d", &D, &S1, &S2); memset (b, 0, sizeof (b)); int n = 0, j = 0; D++; do { ll tmp = D; j = 0; n = 0; while (tmp) { if (tmp & 1) { b[j++] = 1; n++; } else b[j++] = 0; tmp >>= 1; } if (n < S1) { int add = S1 - n; j = 0; while (add) { if (!b[j]) b[j] = 1, add--; j++; } break; } else D += low_bit (D); }while (n < S1 || n > S2); ll ans = 0, x = 1; for (int i=0; i<64; ++i) { if (b[i]) ans += x; x <<= 1; } printf ("Case #%d: %I64d\n", ++cas, ans); } return 0;}

  

转载于:https://www.cnblogs.com/Running-Time/p/4844374.html

你可能感兴趣的文章
APP云测试
查看>>
3-unit3 高速缓存DNS
查看>>
spark mllib 协同过滤算法,基于余弦相似度的用户相似度计算
查看>>
openwrt 基于qmi的 3G|4G拨号
查看>>
俞敏洪励志语
查看>>
开源|基于TensorFlow的聊天机器人-ErGo
查看>>
lucene4.0入门1
查看>>
Svn结合hook实现自动更新及多Project管理更新
查看>>
第三十六讲:tapestry表单组件详解之PasswordField
查看>>
Ubuntu11.10下安装JDK+Eclipse+Maven
查看>>
sgu 222
查看>>
让spring-data-jpa解放你的DAO
查看>>
58沈剑:架构师的平凡之路
查看>>
Hibernate问题-read-write缓存策略
查看>>
C/C++语言中“:”的使用方法
查看>>
sql中实现汉字的拼音首字母查询
查看>>
Android 动态布局 (代码布局)
查看>>
MYSQL备份和恢复
查看>>
spark安装:在hadoop YARN上运行spark-shell
查看>>
Docker存储驱动之ZFS简介
查看>>