1 条题解
-
0
题意简化
个选手(),每个选手 的得分在 上均匀分布。
问:对于每个名次 (第1名最高),哪个选手最可能获得这个名次?核心思想:离散化 + 动态规划
1. 概率模型
选手 得分为 ,相互独立。
我们需要计算每个选手获得每个名次的概率。由于是连续分布,直接计算积分困难。代码采用离散化方法。
2. 离散化得分区间
将所有 和 排序,得到分割点数组 。
每个小区间 内,选手得分概率分布可以近似处理。对于选手 ,考虑其得分落在区间 的情况。
3. DP 状态定义
对于固定的选手 和区间 ,定义:
其中:
- :有多少个选手严格高于选手 的当前得分
- :有多少个选手与选手 同分(在同一小区间内)
4. DP 转移
依次考虑其他选手 (): 设选手 的得分:
- 比 高:概率 (如果 则 )
- 落在 :概率
- 比 低:概率
转移:
- 如果 得分更高:
- 如果 同分:
- 如果 得分更低:
5. 计算名次概率
选手 的名次取决于:
- 有 个选手比他高
- 有 个选手与他同分(包括自己)
他的名次可能是 中的任意一个(同分随机排名)。
假设同分时名次均匀分布,那么选手 获得名次 ()的概率为:
其中 是选手 得分落在该区间的概率。
累加所有区间得到 :选手 获得第 名的概率。
6. 输出答案
对于每个名次 ,找 最大的选手 ,输出编号。
算法步骤
- 离散化:收集所有 和 ,排序去重
- 枚举选手 :作为当前考察对象
- 枚举区间 :选手 可能得分的区间
- DP 计算:计算其他选手相对于该区间的排名分布
- 更新概率:根据 DP 结果更新
- 输出结果:对每个名次选择概率最大的选手
复杂度分析
- 离散化:, 数组大小
- 三重循环:
- 选手 :
- 区间 :
- 其他选手 :
- DP 转移:
- 总复杂度:, 时 ,可过
关键点
- 离散化近似:将连续分布转化为小区间上的均匀分布
- DP 状态设计: 分别表示严格更高和同分的选手数
- 同分处理:假设同分时名次均匀随机
- 概率累加:对每个选手每个可能得分区间分别计算
样例解释
样例1:选手1区间[1,6],选手2区间[4,9]
- 第1名:选手1更可能(有较低分数段优势)
- 第2名:选手2更可能
样例2:8个选手区间依次错开
每个选手在自己的区间有优势,所以名次与编号一致。代码特点
- 使用
eqs=1e-11作为浮点数精度判断 - DP 数组重用,每轮清零
- 注意边界条件处理( 等)
- 输出时误差 内取编号小的
- 1
信息
- ID
- 6014
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者