updated on 2018.11.17:
1. 之前所说的最后一项优化经检验发现有\(bug\),已经去掉;
2. 对文中的一些错误进行了修改,同时对文章的行文作了一些调整,便于大家理解。
建议大家在博客里食用:传送门
要是PJ组再考这么难的DP,我就当官把CCF取缔了
开个玩笑。
此题正解:\(\mathrm{DP}\)+各种剪枝 or 优化
一、引理
对于每个乘客,能搭载ta的车的发车时间只有\(m\)种情况;
设这个乘客开始等候的时间是\(t_i\),则对应的\(m\)种情况是\([t_i,t_i+m)\)(方括号 和 圆括号 表示左闭右开区间)。
证明
如果存在一种情况,其发车时间是\(\geqslant t_i+m\)的,则由题意可知,发车时间可以提早若干轮(也就是减去若干个\(m\))到达\([t_i,t_i+m)\)这个区间,这样做不会影响发车时间\(\geqslant t+m\)的那趟车,不会有后效性。
如果\(<m\)的话,那这个乘客根本就坐不上这趟车,所以不需要考虑。
二、基本思想
首先,题目给定我们的这\(n\)个人开始等候的时间是乱的,所以我们要先按照开始等车的时间把这\(n\)个人排个序。
设\(f[i][j]\)表示用摆渡车已经载了前\(i\)个人,且搭载了第\(i\)个人(不一定只搭载第\(i\)个人)的那趟摆渡车的发车时间是(\(t_i+j\))的最小等候时间和。(\(t_i\)的意义与题意相同)
这里要注意:\(t_i+j\)同时还需要满足\(t_i+j<t_{i+1}\)
因为如果\(\geqslant t_{i+1}\),那这趟车就可以把第\(i+1\)个人也搭上了,违反了\(\mathrm{DP}\)状态的定义。对于每个\(f[i][j]\),枚举上一趟摆渡车的出发时间。
等等!数据范围写着:
\[1 \leqslant t_i \leqslant 4\times10^6 \]
你跟我说枚举时间?你这最起码都\(O(n*t_i) \sim O(2\times10^9)\) 的时间复杂度了,怎么