A spy in the Metro
多组数据
输入n,一直线地铁线上有n个车站。
输入T,表示间谍要在时间T在车站n与人会面
输入ti,表示i到i+1站地铁所花费的时间。
输入m1表示从1向n开的车的数量。
输入di 表示第i辆车的出发时间。
输入m2表示从n向1开的车的数量。
输入ei 表示第i辆车的出发时间。
间谍0时刻时在第一站,输出最少在车外等待时间,若不能到n输出impossible。(尽量使间谍乘车)
f[i][j]表示时间i时,间谍在j车站未来最少等车时间。
在车站等候f[i+1][j]+1
坐车向左f[i+tj][j+1]
坐车向右f[i+t(j-1)][j-1]
三者取最小即可,还要做时间i时有无在车站j向左向右的预处理。
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int M=1e9; int f[205][55],ti[55]; bool sf[205][55][2]; int main() { int n,cas=0; while(scanf("%d",&n)&&n) { memset(sf,0,sizeof(sf)); int t,m; scanf("%d",&t); for(int i=1;i<n;++i) scanf("%d",&ti[i]); scanf("%d",&m); for(int i=1;i<=m;++i) { int tt; scanf("%d",&tt); for(int j=1;tt<=t&&j<=n;++j) sf[tt][j][0]=1,tt+=ti[j]; } scanf("%d",&m); for(int i=1;i<=m;++i) { int tt; scanf("%d",&tt); for(int j=n;tt<=t&&j;--j) sf[tt][j][1]=1,tt+=ti[j-1]; } for(int i=1;i<n;++i) f[t][i]=M; f[t][n]=0; for(int i=t-1;i>=0;--i) for(int j=1;j<=n;++j) { f[i][j]=f[i+1][j]+1; if(j!=n&&sf[i][j][0]&&i+ti[j]<=t) f[i][j]=min(f[i][j],f[i+ti[j]][j+1]); if(j!=1&&sf[i][j][1]&&i+ti[j-1]<=t) f[i][j]=min(f[i][j],f[i+ti[j-1]][j-1]); } printf("Case Number %d: ",++cas); if(f[0][1]>=M) printf("impossible\n"); else printf("%d\n",f[0][1]); } return 0; }