Description
贝茜有C(1≤C≤1000)门科目的作业要上交,之后她要去坐巴士和奶牛同学回家.
每门科目的老师所在的教室排列在一条长为H(1≤H≤1000)的走廊上,他们只在课后接收作业.交作业不需要时间.贝茜现在在位置0,她会告诉你每个教室所在的位置,以及走廊出口的位置.她每走1个单位的路程,就要用1秒.她希望你计算最快多久以后她能交完作业并到达出口.
Input
第1行输入三个整数C,H,B,B是出口的位置.之后C行每行输入两个整数,分别表示一个老师所在的教室和他的下课时间.
Output
贝茜最早能够到达出口的时间.
Sample Input
4 10 3
8 9
4 21
3 16
8 12
Sample Output
22
HINT
题解
f[i][j][0/1]表示完成了1-i,j-n位置的课在i或者j的最小时间。
代码
#include<bits/stdc++.h>
#define mod 19260817
#define inf 1000000005
#define pa pair<int,int>
typedef long long ll;
using namespace std;
inline int read()
{
int x=0,f=1;char ch=getchar();
while (ch<'0'||ch>'9'){if (ch=='-')f=-1;ch=getchar();}
while (ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
struct node{int p,t;}a[1005];
int c,h,b,f[1005][1005][2];
bool cmp(node a,node b){return a.p<b.p;}
int main()
{
c=read();h=read();b=read();
for (int i=1;i<=c;i++)
a[i].p=read(),a[i].t=read();
sort(a+1,a+c+1,cmp);
memset(f,63,sizeof(f));
f[1][c][0]=max(a[1].p,a[1].t);
f[1][c][1]=max(a[c].p,a[c].t);
for (int i=1;i<=c;i++)
for (int j=c;j>=i;j--)
{
f[i][j][0]=min(f[i][j][0],max(f[i-1][j][0]+a[i].p-a[i-1].p,a[i].t));
f[i][j][0]=min(f[i][j][0],max(f[i][j+1][1]+a[j+1].p-a[i].p,a[i].t));
f[i][j][1]=min(f[i][j][1],max(f[i-1][j][0]+a[j].p-a[i-1].p,a[j].t));
f[i][j][1]=min(f[i][j][1],max(f[i][j+1][1]+a[j+1].p-a[j].p,a[j].t));
}
int ans=inf;
for (int i=1;i<=c;i++)
ans=min(ans,min(f[i][i][0],f[i][i][1])+abs(b-a[i].p));
printf("%d",ans);
return 0;
}