1 条题解
-
0
题目大意
给定 种数字,每种数字 有 个。需要将它们排成一个序列,使得每个前缀的众数(出现次数最多,平局时取数值最大)的和最大。求这个最大和。
算法思路
核心思想
贪心构造 + 后缀和优化
关键观察
数值大的数字优势:由于平局时取数值大的作为众数,所以大数值的数字有优势
构造策略:从大到小考虑数字,尽量让大数字在前缀中占据多数
数学分析:对于数字 ,如果它的数量 能成为某个前缀的众数,那么它在这个前缀中需要严格多于所有比它大的数字
具体分析
- 贡献计算
对于数字 :
比 大的数字有 个
要让 成为前缀众数,至少需要放置 个 ,使得这 个 的数量超过所有比 大的数字的总数
每个 的贡献可以累加计算
- 算法实现
从大到小处理数字( 从 到 )
维护 maxn 表示当前遇到的最大
sum[x] 表示当数字数量为 时,这些数字的贡献和
对于每个 ,累加 sum[a[i]] 到答案
- 公式推导
设排序后的 为 最大和 = 通过维护后缀信息高效计算
算法流程
读入 和数组
从 到 遍历:
更新 sum 数组(计算不同数量级的贡献)
累加 sum[a[i]] 到答案
输出答案
复杂度分析
时间复杂度:,线性复杂度
空间复杂度:
总结
本题的关键在于:
发现贪心性质:大数值的数字应该优先安排
数学建模:将问题转化为贡献计算
后缀优化:通过维护后缀信息避免重复计算
线性处理:在 范围内高效求解
- 1
信息
- ID
- 5931
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者