Solution for ZZQ's Catforces
idea by Nanako & bakapiano
prepared by bakapiano & zzq
题意
本题的背景为一个简化版的 CF 赛制,n 道题有一个初始分数 a[i],掉分速度为 b[i]/每分钟 与与解题所需时间 t[i],请你安排一个解题顺序使得得分:
最大。
题解
题目难度 medium-
注意到 \sum_{i=1}^{n}a_{i} 项与解题顺序无关,我们只需要最小化总掉分数即可。
首先我们任意安排一个解题顺序 p_{1},…,p_{n},并尝试对当前得到的答案进行改进。设 p 数组中相邻的两项为 x,y(1 \leq x < y \leq n),易知交换相邻两项对其他题目的得分没有影响(因为对于除 x,y 的任意题目 i 来说 \sum_{j=1}^{i}t_{j} 不变),下面我们来推导在什么情况下交换 x,y 两项能使得答案变得更优。
首先设 pre = \sum_{j=1}^{x-1}t_{j}
设交换前 x,y 两项对答案的贡献:
交换后的贡献:
使答案更优的条件:
化简可得:
即:
设k_{i}=t_{i}/b_{i},注意到当 k_{y}<k_{x} 时交换相邻两项会使答案更优,因此我们可以选择序列中 k_{i} 最小的一项并把它不断往前交换来使答案变的更优,然后选 k_{i} 次小的一项 … 重复上述操作直至序列中的 k_{i} 变得非递减,此使得到的排列便是最优解题顺序。
因此只需将所有题目按 t_{i}/b_{i} 的顺序排序,O(n) 计算答案即可,总复杂度 O(nlogn+n) 可以在规定时限内通过本题。
tag: 贪心 sort
标称
注意使用 double 计算斜率可能会造成精度误差,sort 时使用自定义比较函数即可避免这一问题。
1 |
|
Solution for ZZQ's Catforces
http://blog.bakapiano.site/2020/01/16/Solution-for-ZZQ-s-Catforces/