CF185 div1 B. Cats Transport(单调队列斜率优化dp)

CF185 div1 B. Cats Transport

题意:有m只小猫,n座山,p个员工。第i座山到跟前一座山的距离距离是d[i]。第i只小猫在第h[i]座山上玩,它玩好的时间是t[i]。然后p个员工从第1座山出发,一路过去,把玩好,在等待的小猫收起来。问小猫的最少等待时间和是多少。

解题思路:我们考虑第i只,和第j只小猫的选择,第i只小猫距离起点的距离为a[i](这个很容易预处理),它玩好的时间是t[i],第j只小猫距离起点的时间是a[j],玩好的时间是t[j],那么,如果a[i] - a[j] > t[i] - t[j],那么,如果我们的选择是,某个员工一定要去吧i收下的话,那么j可以花一定的等待时间,让这个员工把它也收下,前面那个公式转换一下,可以变成a[i] - t[i]  > a[j] - t[j] 。所以我们就先以a[i] - t[i]从大到小给m只小猫排序。为什么要这样做呢?因为我们可以根据这个,列出dp方程, dp[i][j]表示一共出发了j个人把前i只小猫收完的最小等待时间和是多少,那么dp[i][j] = dp[k][j-1] + add[k+1][j],k从0到i-1,去最小值。add[i][j]表示的是,出发一个人,把i到j都收完的最小等待时间,这里就是为什么要先给小猫排序了。假如我们只有两只猫i,j。排好序后,先取的是i,那么一个人取两只猫,肯定是让i不用等,然后j等待一定的时间,这个时间就是add了。那么add怎么算呢?设d[i] = a[i] - t[i],add=d[k+1] * ( j - k ) - (sum[j] - sum[k] ) ,sum[i]表示前i只猫的d[i]之和。为什么是这么计算呢?考虑两只猫i,j的情况就可以得出这个结论了。那么dp方程推出来了dp[i][j]=dp[i-1][k]+d[k+1]*(j-k)-sum[j]+sum[k];但是,这里暴力转移的话,复杂度是o(n^3)的,


所以接下来就是斜率优化的事情了,把方程转换一下,


变成dp[i-1][k]+sum[k]-d[k+1]*k=dp[i][j]+sum[j]-j*d[k+1];

把j看做斜率,dp[i][j] + sum[j] 看做截距,就是求一个截距最小了,然后弄个单调队列优化下。

代码:

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值