P5017 摆渡车题解报告

再给普及选手讲课时遇到的一道dp好题。
为什么好——多重解法


题目描述

有 nn 名同学要乘坐摆渡车从人大附中前往人民大学,第 ii 位同学在第 t_it
i
​ 分钟去 等车。只有一辆摆渡车在工作,但摆渡车容量可以视为无限大。摆渡车从人大附中出发、 把车上的同学送到人民大学、再回到人大附中(去接其他同学),这样往返一趟总共花费mm分钟(同学上下车时间忽略不计)。摆渡车要将所有同学都送到人民大学。

凯凯很好奇,如果他能任意安排摆渡车出发的时间,那么这些同学的等车时间之和最小为多少呢?

注意:摆渡车回到人大附中后可以即刻出发。

输入输出格式

输入格式:
第一行包含两个正整数 n , m . n , m , n,m.n,m, n,m.n,m以一个空格分开,分别代表等车人数和摆渡车往返 一趟的时间。
第二行包含 n n n个正整数,相邻两数之间以一个空格分隔,第 i i i 个非负整数 t i t_i ti ​ 代 表第 i i i 个同学到达车站的时刻。

输出格式:
输出一行,一个整数,表示所有同学等车时间之和的最小值(单位:分钟)。

输入输出样例

输入样例#1: 复制
5 1
3 4 4 3 5
输出样例#1: 复制
0
输入样例#2: 复制
5 5
11 13 1 5 5
输出样例#2: 复制
4
对于 100% 的数据, n ≤ 500 , m ≤ 100 , 0 ≤ t i ≤ 4 ∗ 1 0 6 n ≤ 500 , m ≤ 100 , 0 ≤ t i ≤ 4 × 1 0 6 n ≤ 500, m ≤ 100, 0 ≤ t_i ≤ 4*10^6n≤500,m≤100,0≤t_i≤4×10^6 n500,m100,0ti4106n500,m100,0ti4×106


解题思路

首先,我们发现这道题贪心不行
然后决定是 d p dp dp!
我们考虑 d p [ i ] [ j ] dp[i][j] dp[i][j]表示在第i分钟,有j个人在等车的最优解。
a [ i ] 表 示 在 i 时 刻 等 车 的 人 数 a[i]表示在i时刻等车的人数 a[i]i
s u m [ i ] 为 a [ i ] 的 前 缀 和 sum[i]为a[i]的前缀和 sum[i]a[i]
t i m [ i ] 为 直 到 i 时 刻 , 之 前 所 有 人 等 车 时 间 之 和 , 即 s u m [ i ] 的 前 缀 和 tim[i]为直到i时刻,之前所有人等车时间之和,即sum[i]的前缀和 tim[i]isum[i]
我们有两种决策:1 等 2 不等
等: d p [ i + 1 ] [ j + a [ i + 1 ] ] = m a x ( d p [ i + 1 ] [ j + a [ i + 1 ] ] , d p [ i ] [ j ] + j ) dp[i+1][j+a[i+1]]=max(dp[i+1][j+a[i+1]],dp[i][j]+j) dp[i+1][j+a[i+1]]=max(dp[i+1][j+a[i+1]],dp[i][j]+j)
不等: d p [ i + m ] [ s u m [ i + m ] − s u m [ i ] ] = m i n ( d p [ i + m ] [ s u m [ i + m ] − s u m [ i ] ] , d p [ i ] [ j ] + t i m [ i + m ] − t i m [ i ] − s u m [ i ] ∗ m ) dp[i+m][sum[i+m]-sum[i]]=min(dp[i+m][sum[i+m]-sum[i]],dp[i][j]+tim[i+m]-tim[i]-sum[i]*m) dp[i+m][sum[i+m]sum[i]]=min(dp[i+m][sum[i+m]sum[i]],dp[i][j]+tim[i+m]tim[i]sum[i]m)
然后!TLE在挥手我们需要优化它。
只有500个人却分布在4e6的时间线上?就是说司机总是在等人(搓炉石
然后我们把两人之间大于 2 m 2m 2m的时间使用一些膜法(-1s)消除掉!
为什么是 2 m 2m 2m
P5017 摆渡车题解报告_第1张图片
在这种情况下,我们发现有可能转移 2 m 2m 2m是最优的,所以我们保留2m的时间。
这样我们就可以优化为 O ( 2 n m 2 ) O(2nm^2) O(2nm2)啦!
最后边界问题,因为我们可能不是结束与tmax(最后一波人要等一会),所以预处理边界都是tmax+m。然后对于dp时,我们只需要记录个spc来更新答案。

你可能感兴趣的:(DP)