//UVA1025ASpyInTheMetro
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#define M(a) memset(a, 0, sizeof(a))
using namespace std;
const int INF = 1e6;
int t[55];
int have_train[260][55][2];
int d[260][55];
int main() {
int N, T, kase = 0;
while(scanf("%d", &N) == 1 && N) {
scanf("%d", &T);
for(int i = 1; i <= N - 1; i++) scanf("%d", &t[i]);
int M1;
scanf("%d", &M1);
M(have_train);
for(int i = 1; i <= M1; i++) {
int Time, j = 1;
scanf("%d", &Time);
while(Time <= T && j < N) {
have_train[Time][j][0] = 1;
Time += t[j++];
}//判断每一趟车每一时刻从每一点出发向右行驶的可行性
}
int M2;
scanf("%d", &M2);
for(int i = 1; i <= M2; i++) {
int Time, j = N;
scanf("%d", &Time);
while(Time <= T && j > 1) {
have_train[Time][j][1] = 1;
Time += t[--j];
}
}//逆向,原理同上
for(int i = 1; i < N; i++) d[T][i] = INF;
d[T][N] = 0;
for(int i = T - 1; i >= 0; i--) {//以时间为序,由已知推导未知
for(int j = 1; j <= N; j++) {
d[i][j] = d[i + 1][j] + 1;//决策1,维持原状1个单位时间
if(j < N && have_train[i][j][0] && t[j] + i <= T)
d[i][j] = min(d[i][j], d[t[j] + i][j + 1]);//决策2,向左走一个站,考虑这段路程的时间
//并继承左边车站的等待时间
if(j > 1 && have_train[i][j][1] && t[j - 1] + i <= T)
d[i][j] = min(d[i][j], d[t[j - 1] + i][j - 1]);
//同理于上
}
}
printf("Case Number %d: ", ++kase);
if(d[0][1] > 1e5) printf("impossible\n");
else printf("%d\n", d[0][1]);
}
return 0;
}
/*
*/
UVA1025ASpyInTheMetro
最新推荐文章于 2019-03-12 19:54:14 发布