[NOIP2018 普及组] 摆渡车 题解

《关于我上冬令营网课时,听说普及组考过斜率优化DP这件事》

题意理解

摆渡车往返一次要 mmm 分钟,但摆渡车可以在起点等人,故可以将往返一次的时间 T∈[m,∞)T \in [m,\infty )T[m,)(但是个人都不会让他等于正无穷吧?)

求这 nnn 个人等待时间之和最小值。在这里插入图片描述

设置状态

首先,观察数据范围

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-afPsUkMw-1612343952443)(https://imgchr.com/i/yuYSwq#pic_center)]

小数据就不说了吧

显然,可以根据时间设置状态。

fif_{i}fi 表示前 iii 个时间单位的最小花费。

状态转移

题上说了,摆渡车容量可以视为无限大,那么我们可以知道,摆渡车是印度产的,在时间 iii 出发的车可以将在 iii 及之前到站所有人都接走,花费为∑(i−tk)   (tk≤i)\sum (i-t_{k}) \ \ \ (t_{k}\le i)(itk)   (tki)

如果在 iii之前的某时刻 jjj,摆渡车接过一次人呢?(根据题意 jjj 应当满足 0≤j≤i−m0 \le j \le i-m0jim )。

那么就有 fi=min(fi,fj+∑(i−tk))  (j<tk≤i)f_{i}=min(f_{i},f_{j}+\sum (i-t_{k}))\ \ (j < t_{k}\le i)fi=min(fi,fj+(itk))  (j<tki)

这就是状态转移方程,可以发现遍历一段时间是 O(T)O(T)O(T) 的,枚举断点 jjj 也是 O(T)O(T)O(T) 的,而计算 ∑(i−tk)\sum (i-t_{k})(itk)O(n)O(n)O(n) 的。

这个DP时间复杂度为 O(nT2)O(nT^{2})O(nT2)(恭喜你拿到我没截上屏的30分)

DP优化

优化计算

∑(i−tk)\sum (i-t_{k})(itk) 是显然能用前缀和搞一下的:
cnticnt_{i}cnti 表示时间 iii 及之前有多少人在到达。
sumisum_{i}sumi 表示若在 iii<

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值