hdu 5491 The Next(位运算+贪心)

来源:互联网 发布:中学生学什么编程语言 编辑:程序博客网 时间:2024/05/29 06:27

题目链接:hdu 5491 The Next

解题思路

首先将初始的d+1,然后判断二进制先1的个数是否满足。
如果多了,找到最小的i使得s&2^i=1.
如果少了,找到最小的i使得s&2^i=0.
然后s + 2^i,这样保证了每次增加的值最少。

代码

#include <cstdio>#include <cstring>#include <algorithm>using namespace std;typedef long long ll;int bitcount(ll s) {     int c = 0;    while (s) {        if (s&1) c++;        s >>= 1;    }    return c;}int main () {    int cas;    scanf("%d", &cas);    for (int kcas = 1; kcas <= cas; kcas++) {        int l, r;        ll s;        scanf("%lld%d%d", &s, &l, &r);        s++;        while (true) {            int n = bitcount(s);            if (l <= n && n <= r) break;            if (n < l) {                int x = 0;                while (s&(1LL<<x)) x++;                s |= (1LL<<x);            } else {                ll x = s&(-s);                s += x;            }        }        printf("Case #%d: %lld\n", kcas, s);    }    return 0;}
0 0
原创粉丝点击