解题思路
首先将初始的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;
}

本文深入解析HDU5491《TheNext》难题,从核心解题思路出发,通过二进制操作优化算法策略,确保每次增量最小,最终高效求解问题。代码实现清晰,详细步骤助你掌握关键技巧。
&spm=1001.2101.3001.5002&articleId=48849565&d=1&t=3&u=c8b1d1c7a84345efb903a4f18ab93ce7)
215

被折叠的 条评论
为什么被折叠?



