NOIP 2018【摆渡车】题解

updated on 2018.11.17:

1. 之前所说的最后一项优化经检验发现有\(bug\),已经去掉;
2. 对文中的一些错误进行了修改,同时对文章的行文作了一些调整,便于大家理解。


建议大家在博客里食用:传送门


要是PJ组再考这么难的DP,我就当官把CCF取缔了


开个玩笑。

此题正解:\(\mathrm{DP}\)+各种剪枝 or 优化


一、引理

  • 对于每个乘客,能搭载ta的车的发车时间只有\(m\)种情况

  • 设这个乘客开始等候的时间是\(t_i\),则对应的\(m\)种情况是\([t_i,t_i+m)\)(方括号 和 圆括号 表示左闭右开区间)。

证明

  1. 如果存在一种情况,其发车时间是\(\geqslant t_i+m\)的,则由题意可知,发车时间可以提早若干轮(也就是减去若干个\(m\)到达\([t_i,t_i+m)\)这个区间,这样做不会影响发车时间\(\geqslant t+m\)的那趟车,不会有后效性

  2. 如果\(<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)\) 的时间复杂度了,怎么

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值