题目简介
给定整数 a 和 b,输出区间 [a,b] 中对应二进制表示含 1 的个数最多的整数。
如果存在多个解,则输出符合条件的最小的整数。
0≤a≤b≤2^63−1
说明
数据量很大,注意开unsigned long long。
思路就是在a的基础上不断把低位0变为1(利用巧妙的位运算实现),但不能超出b。这样同时保证了1的个数最多且数值最小。
#include <stdio.h>
typedef unsigned long long ll;
int main(void)
{
int t, i;
ll a, b, ans;
scanf("%d", &t);
for (i = 1; i <= t; ++i){
scanf("%llu%llu", &a, &b);
ans = a;
while ((ans | (ans + 1)) <= b)
ans |= ans + 1; //最低位的0设为1
printf("Case %d: %llu\n", i, ans);
}
return 0;
}
本文介绍了一种算法,用于找出闭区间[a,b]内二进制表示含1最多的整数,并确保当存在多个解时选择最小的一个。通过巧妙地使用位运算,在不超出b的情况下尽可能多地将a的低位0转换为1。
499

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



