1 条题解

  • 0
    @ 2025-12-9 16:05:02

    题目大意

    给定 nn 种数字,每种数字 iiaia_i 个。需要将它们排成一个序列,使得每个前缀的众数(出现次数最多,平局时取数值最大)的和最大。求这个最大和。

    算法思路

    核心思想

    贪心构造 + 后缀和优化

    关键观察

    数值大的数字优势:由于平局时取数值大的作为众数,所以大数值的数字有优势

    构造策略:从大到小考虑数字,尽量让大数字在前缀中占据多数

    数学分析:对于数字 ii,如果它的数量 aia_i 能成为某个前缀的众数,那么它在这个前缀中需要严格多于所有比它大的数字

    具体分析

    1. 贡献计算

    对于数字 ii

    ii 大的数字有 (ni)(n-i)

    要让 ii 成为前缀众数,至少需要放置 kkii,使得这 kkii 的数量超过所有比 ii 大的数字的总数

    每个 ii 的贡献可以累加计算

    1. 算法实现

    从大到小处理数字(iinn11

    维护 maxn 表示当前遇到的最大 aia_i

    sum[x] 表示当数字数量为 xx 时,这些数字的贡献和

    对于每个 ii,累加 sum[a[i]] 到答案

    1. 公式推导

    设排序后的 aia_ib1b2bnb_1 \ge b_2 \ge \cdots \ge b_n 最大和 = i=1ni×min(ai,某个上界)\sum_{i=1}^n i \times \min(a_i, \text{某个上界}) 通过维护后缀信息高效计算

    算法流程

    读入 nn 和数组 aa

    i=ni=n11 遍历:

    更新 sum 数组(计算不同数量级的贡献)

    累加 sum[a[i]] 到答案

    输出答案

    复杂度分析

    时间复杂度:O(n+maxai)O(n + \max a_i),线性复杂度

    空间复杂度:O(n+maxai)O(n + \max a_i)

    总结

    本题的关键在于:

    发现贪心性质:大数值的数字应该优先安排

    数学建模:将问题转化为贡献计算

    后缀优化:通过维护后缀信息避免重复计算

    线性处理:在 n105n \le 10^5 范围内高效求解

    • 1

    信息

    ID
    5931
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者