[gym 100861E] Extreme Programming
前言
这个题赛时的想法已经很对了, 主要探讨排序的证明
思路
题意
给定 组 , 要求一个顺序 , 使得对应的 最大, 相同 应当使得 最小, 输出最优的
不难发现只考虑 \(EP\) 是简单背包
考虑「不同选择方案相同 \(EP\)」时, 怎样才能让 \(ET\) 最小, 修改状态被证明是完蛋的
对 \(ET\) 进行显而易见的变形可得
赛时出现的一个小问题
赛时认为不能使用 存结果, 会像很多题一样丢状态
但是实际上观察状态设计
表示考虑前 个题目, 使用了 的时间时, 最优的
对于一个状态, 除了最优的 , 其他的状态在接下来的更新中一定不优
证明
对于 , 如果我们遇到一个题目 并且决定选上他之后, 会变成
不难发现由于 , 在当前如果不是最优, 后面一定不会更优
所以现在的问题变成了, 能否确定一组顺序, 使得按照顺序选择的方案满足 \(ET\) 最小
不得不想起之前一道 \(\textrm{div 2 C}\) 的逐步贪心策略
增量法发力, 同上可知, 对于一组 \(\{P_i, T_i\}\) , 其关于 \(ET\) 的增量为 \((\sum_{j = 1}^{k} T_j) P_i + T_i P_i\)
发现权重和 \((\sum_{j = 1}^{k} T_j)\) , 增量法发力失败
用交换相邻元素的方法结合增量法来比较哪种排列更好
假设 \([1,\min\{i, j\})\) 中的 \(T\) 之和为 \(S\) , 那么
- 如果 \(i\) 在前, \(j\) 在后
\(\Delta ET = S P_i + T_iP_i + (S + T_i) P_j + T_jP_j\) - 如果 \(i\) 在后, \(j\) 在前
\({\Delta ET}^{\prime} = S P_j + T_jP_j + (S + T_j) P_i + T_iP_i\) - 作差\[\begin{align*} &\Delta ET - {\Delta ET}^{\prime} \\ =& \left[S P_i + T_iP_i + (S + T_i) P_j + T_jP_j\right] - \left[S P_j + T_jP_j + (S + T_j) P_i + T_iP_i\right] \\ =& S P_i + T_iP_i + S P_j + T_i P_j + T_jP_j - S P_j - T_j P_j - S P_i - T_j P_i - T_iP_i \\ =& T_i P_j - T_j P_i \end{align*}\]
不难发现按照 \(T_i P_j - T_j P_i < 0\) 排序即可
总结
如果满足贪心性质, \(\rm{pair}\) 作为 \(f\) 中的内容是完全可行的
推导贪心策略的常用方法
- 反证 + 作差
- 增量法
- 交换相邻元素法

浙公网安备 33010602011771号