1 条题解
-
0
题目详解:2021A - Meaning Mean(平均值的意义)
问题重述
我们有一个长度为 的正整数数组 。每次操作:
- 选择两个不同位置的数 和
- 删除它们,并加入
- 重复直到只剩一个数
目标是最大化最后剩下的那个数。
核心思路
第一步:忽略向下取整,先考虑精确平均值
假设我们暂时忽略 ,那么一次操作就是把两个数变成它们的算术平均: [ \frac{a_i + a_j}{2} ]
这是一个线性操作。我们可以把整个过程看作:每个原始数字最终对结果有一个贡献系数,并且这些系数的和必须为 。
为什么系数和为 ?
- 初始有 个数,每个数“携带”自己的值。
- 每次操作:删除两个数,加入它们的平均值。这相当于把这两个数的“权重”平均分配给新数。
- 最终只剩一个数,它包含了所有原始数的信息,且权重总和为 。
因此,最终结果可以写成: [ x = \sum_{k=1}^n c_k \cdot a_k ] 其中 ,且 。
第二步:系数的可能分布
通过一些例子可以发现:
- 如果按顺序合并 ,再与 合并,等等,那么最后:
- 的系数是
- 的系数是
- 的系数是
- ...
- 的系数是
检查一下: [ \frac{1}{2} + \frac{1}{4} + \frac{1}{8} + \dots + \frac{1}{2^{n-1}} = 1 - \frac{1}{2^{n-1}} < 1 ] 等等,这里不对劲!因为 的系数其实是 ,但总和确实小于 。
实际上,我们还需要加上最后一次合并时来自前面的贡献。更准确地说:
最终结果是: [ x = \frac{a_n}{2} + \frac{a_{n-1}}{4} + \frac{a_{n-2}}{8} + \dots + \frac{a_1}{2^{n-1}} + \frac{\text{某个常数}}{2^{n-1}}? ] 其实每次合并都会产生一个“残余项”,但最终可以证明:
如果我们按升序排序后从最小的开始合并,那么最大的数得到最大的系数。
第三步:最优策略
为了最大化 ,在 的约束下,应该把最大的系数分配给最大的 。
系数的大小由合并顺序决定:
- 越晚参与合并的数,被平均的次数越少,系数越大。
- 实际上,最优策略是:
- 将数组升序排序
- 从最小的两个开始合并
- 将结果与下一个最小的合并
- 依此类推
这样,最大的数 只参与最后一次合并,系数为 ;
次大的数 参与倒数第二次合并,系数为 ;
以此类推。
第四步:为什么带向下取整也一样有效?
因为所有操作都是除以 并向下取整,所以:
- 如果我们在精确平均值下得到最大值,那么带向下取整的结果只会更小或相等。
- 但通过上述顺序合并,我们可以尽可能保留大数的精度,使向下取整的损失最小。
- 实际上可以证明:这个贪心顺序在原始问题中也是最优的。
第五步:算法实现
对于每个测试用例:
- 将数组 升序排序
- 初始化
ans = a[0] - 从 到 : [ ans = \left\lfloor \frac{ans + a[i]}{2} \right\rfloor ]
- 输出
ans
时间复杂度:(排序)
第六步:验证样例
样例1:
排序后:
- 第一步:
- 第二步:
- 第三步:
- 第四步: ✅
样例2:
排序:
- 第一步:
- 第二步: ✅
样例3:
排序后全是
- 每次合并:
- 最终: ✅
总结
- 问题本质:在每次取两个数的平均值(向下取整)的操作下,最大化最终结果。
- 关键观察:最终结果是原始数的加权平均,权重和为 。
- 最优策略:升序排序后,从最小的开始依次合并,这样最大的数获得最大权重。
- 复杂度:,完全满足 的限制。
- 1
信息
- ID
- 6307
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 2
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者