有线性的n个车站,从左到右编号分别为1~n。有M1辆车从第一站开始向右开,有M2辆车从第二站开始向左开。在0时刻主人公从第1站出发,要在T时刻回见车站n 的一个间谍(忽略主人公的换乘时间)。输出最少的等待时间,如果无解输出impossible。
思路:“时间单向流逝,是天然的序,影响的决策的只有当前的时间和地点”这是lrj的第一句话,真6,已经引出了解法和阶段决策
向下决策:
//0kb 22ms #include<cstdio> #include<iostream> #include<cstring> #define inf 0x3f3f3f3f using namespace std; int T,n; int t[55]; bool has_train[2][222][55]; int dp[222][55]; void ini() { memset(has_train,0,sizeof(has_train)); dp[T][n]=0; for(int i=1;i<n;i++) dp[T][i]=inf; } int main() { int cnt=0; while(scanf("%d",&n),n){ scanf("%d",&T); ini(); for(int i=1;i<n;i++) scanf("%d",&t[i]); int tot,time; scanf("%d",&tot); for(int i=0;i<tot;i++){ scanf("%d",&time); has_train[0][time][1]=true; for(int i=1;i<n;i++){ if((time+=t[i])<=T) has_train[0][time][i+1]=true; else break; } } scanf("%d",&tot); for(int i=0;i<tot;i++){ scanf("%d",&time); has_train[1][time][n]=true; for(int i=n-1;i>0;i--){ if((time+=t[i])<=T) has_train[1][time][i]=true; else break; } } for(int i=T-1;i>=0;i--) for(int j=1;j<=n;j++){ dp[i][j]=dp[i+1][j]+1; if(j<n&&has_train[0][i][j]&&i+t[j]<=T) dp[i][j]=min(dp[i][j],dp[i+t[j] ][j+1]); if(j>1&&has_train[1][i][j]&&i+t[j-1]<=T) dp[i][j]=min(dp[i][j],dp[i+t[j-1] ][j-1]); } printf("Case Number %d: ",++cnt); if(dp[0][1]>=inf) printf("impossible\n"); else printf("%d\n",dp[0][1]); } return 0; }
//0kb 15ms #include<cstdio> #include<iostream> #include<cstring> #define inf 0x3f3f3f3f using namespace std; int T,n; int t[55]; bool has_train[2][222][55]; int dp[222][55]; void ini() { memset(has_train,0,sizeof(has_train)); dp[0][1]=0; for(int i=2;i<=n;i++) dp[0][i]=inf; } int main() { int cnt=0; while(scanf("%d",&n),n){ scanf("%d",&T); ini(); for(int i=1;i<n;i++) scanf("%d",&t[i]); int tot,time; scanf("%d",&tot); for(int i=0;i<tot;i++){ scanf("%d",&time); has_train[0][time][1]=true; for(int i=1;i<n;i++){ if((time+=t[i])<=T) has_train[0][time][i+1]=true; else break; } } scanf("%d",&tot); for(int i=0;i<tot;i++){ scanf("%d",&time); has_train[1][time][n]=true; for(int i=n-1;i>0;i--){ if((time+=t[i])<=T) has_train[1][time][i]=true; else break; } } for(int i=1;i<=T;i++) for(int j=1;j<=n;j++) { dp[i][j]=dp[i-1][j]+1; if(j>1&&i-t[j-1]>=0&&has_train[0][i-t[j-1] ][j-1]) dp[i][j]=min(dp[i][j],dp[i-t[j-1] ][j-1]); if(j<n&&i-t[j]>=0&&has_train[1][i-t[j] ][j+1]) dp[i][j]=min(dp[i][j],dp[i-t[j] ][j+1]); } printf("Case Number %d: ",++cnt); if(dp[T][n]>=inf) printf("impossible\n"); else printf("%d\n",dp[T][n]); } return 0; }