1 条题解
-
0
好的,我们结合题目与给出的核心观察,来写一份详细的中文题解。
题目回顾
我们定义:
- 一个数 的美丽度 = 二进制表示中 的个数。
- 一个数组的美丽度 = 所有元素美丽度之和。
- 一次操作:选择一个 ,将其增加 。
- 最多进行 次操作,求数组美丽度的最大值。
核心观察(Key Observation)
对于一个数 ,要增加它的美丽度,最优方式是:找到二进制中 最低位的 0,把它变成 1,并把所有更低位都变成 0。
为什么这样是最优的?
设 的最低 0 位在第 位( 的值),记为特殊位。
-
将特殊位从 0 变 1,同时更低位全变 0,得到的数是:
$$y = x \ \text{with bit p set to 1, lower bits cleared} $$ -
从 增加到 的过程:
- 每次增加 1,最低的 0 位要么是 ,要么是比 更低的位。
- 但一旦最低 0 位低于 ,比 高的位不变,而低于 的位中存在 0,此时的美丽度 ≤ 的美丽度。
- 直到到达 之前,美丽度不会超过 。
因此:在 之间的任何数,美丽度都 ≤ 原数 的美丽度,只有到达 时,美丽度才真正增加。
结论:要让 的美丽度增加,最少操作数就是 ,且这是当前最优的“增一美”方式。
转化为贪心策略
因为美丽度只关心二进制 的个数,且增加一个数的美丽度的最优方式是“清除低位的 1 并设置一个更高位的 0 为 1”,我们可以全局贪心:
- 初始美丽度 = 所有数的二进制 1 的个数和。
- 维护一个“位池”:对于每个二进制位 (从低位到高位),统计当前所有数中,这个位上是 0 的数量。
- 从低位 到高位:
- 如果第 位上有 个 0,且 :
- 我们最多可以一次将 个数的第 位从 0 变成 1,每操作一个数需要 次操作,同时该数的美丽度 +1。
- 因此,这一步能增加的总美丽度 = 。
- 操作后, 减少 。
- 如果第 位上有 个 0,且 :
- 继续向高位迭代,直到 不够或没有 0 位。
为什么贪心正确?
因为低位的 更小,用更少的操作获得 +1 美丽度,性价比更高,所以应该先处理低位。
算法步骤
设 个数,, 次操作。
- 初始化 。
- 初始化一个数组 ,表示所有数在第 位上为 0 的个数。
- 对于 (因为 ,但操作可能进位到 内):
- 如果 ,则无法继续。
- 可以操作的次数 $ops = \min(zero\_cnt[bit], \lfloor k / 2^{bit} \rfloor)$。
- 增加 。
- 减少 。
- 输出 。
复杂度
- 每个数最多处理 个位。
- 总复杂度 ,完全可过。
示例验证
用题目第一个例子:
,初始:
- 二进制:
0: 0
1: 1
7: 111
2: 10
4: 100
popcount 和 = 0 + 1 + 3 + 1 + 1 = 6(不对,等一下,我们验证)
仔细算: 0 → 0 个 1
1 → 1 个 1
7 → 3 个 1
2 → 1 个 1
4 → 1 个 1
总和 = 0+1+3+1+1 = 6但题目输出是 8,说明操作后 +2 个 1。
贪心: bit 0():所有数最低位:
0(0),1(1),7(1),2(0),4(0) → 0 的个数 = 3
,
ans = 6 + 2 = 8
k = 2 - 2*1 = 0
结束,输出 8 ✅
- 1
信息
- ID
- 6627
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 6
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者