#P2857. USACO(112)动态规划(区间型)4:提交作业P2339 [USACO04OPEN] Turning in Homework G

USACO(112)动态规划(区间型)4:提交作业P2339 [USACO04OPEN] Turning in Homework G

Description

# [USACO04OPEN] Turing in Homework G ## 题目描述 贝茜有 $ C $ ( $ 1 \leq C \leq 1000 $ )门科目的作业要上交,之后她要去坐艿(nuai)哝(nong)同学和巴士(EasonLiang)回家。 每门科目的老师所在的教室排列在一条长为 $ H $ ( $ 1 \leq H \leq 1000 $ )的走廊上,他们只在课后接收作业,交作业不需要时间。贝茜现在在位置0,她会告诉你每个教室所在的位置,以及走廊出口的位置。她每走1个单位的路程,就要用1秒。她希望你计算最快多久以后她能交完作业并到达出口。 ## 输入格式 第一行:三个整数 $C$,$H$ 和 $B$,$1 \le C \le 1000,1 \le H \le 1000,0 \le B \le H$。 第二行到 $C+1$ 行:第 $i+1$ 行有两个整数 $X_i$ 和 $T_i$,$0 \le X_i \le H,0 \le T_i \le 10000$。 $B$ 表示车站位置。 $X_i$ 表示第 $i$ 份作业应该在 $X_i$ 这个位置交。 $T_i$ 表示这个位置(教室)的这个科目老师(也就是收这份作业的老师)下课的时间。 ## 输出格式 单个整数,表示贝西交完作业后走到车站的最短时间 ## 样例 #1 ### 样例输入 #1 ``` 4 10 3 8 9 4 21 3 16 8 12 ``` ### 样例输出 #1 ``` 22 ``` ## 提示 走到坐标 8 处,第 9 分钟交一本作业,等到第 12 分钟时,交另一本作业。再走到坐标 4 处交作业,最后走到坐标 3 处,交最后一本作业,此地就是车站所在位置,共用时 22 分钟



Hint

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=1e3+10;
LL f[N][N][2];
struct node{LL x, t;} a[N];
bool cmp(node n1, node n2){
	return n1.x<n2.x;
}
int main(){
	int n, H, ex; scanf("%d%d%d", &n, &H, &ex);
	for(int i=1; i<=n; i++){
		scanf("%lld%lld", &a[i].x, &a[i].t);
	}
	sort(a+1, a+n+1, cmp);
	memset(f, 0x3f, sizeof(f));
	f[1][n][0]=max(a[1].x, a[1].t);
	f[1][n][1]=max(a[n].x, a[n].t);
	for(int i=1; i<=n; i++){
		for(int j=n; j>=i; j--){
			f[i][j][0]=min({f[i][j][0], max(f[i-1][j][0]+a[i].x-a[i-1].x
			, a[i].t), max(f[i][j+1][1]+a[j+1].x-a[i].x, a[i].t)});
			
			f[i][j][1]=min({f[i][j][1], max(f[i-1][j][0]+a[j].x-a[i-1].x
			, a[j].t), max(f[i][j+1][1]+a[j+1].x-a[j].x, a[j].t)});
		}
	}
	LL ans=1e14;
	for(int i=1; i<=n; i++){
		ans=min(ans, min(f[i][i][0], f[i][i][1])+abs(a[i].x-ex));
	}
	printf("%lld\n", ans);
	return 0;
}