#include #include #define min(x,y) (((x)<(y))?(x):(y)) int N, T, t[32], M[2], d[2][64]; /* On "time" and at "station", she'll be able to arrive at destination, with standing during "standint time" */ /* time station */ int table[ 201][ 64] /* = standing time */ ; /* Departure time table */ /* dir station time */ int timetable[ 2][ 64][ 201] /* = arriving time */ ; int main() { int icase, i, j, k; int M, d; for (icase = 1; ; icase++) { scanf("%d", &N); if (N == 0) { break; } scanf("%d", &T); for (i = 0; i < N-1; i++) { scanf("%d", &t[i]); } for (i = 0; i < 2; i++) { scanf("%d", &M); for (j = 0; j < N; j++) { for (k = 0; k < T; k++) { timetable[i][j][k] = -1; } } for (j = 0; j < M; j++) { scanf("%d", &d); if (i == 0) { for (k = 0; k < N-1; k++) { timetable[i][k][d] = d + t[k]; d += t[k]; } } else { for (k = N-1; k > 0; k--) { timetable[i][k][d] = d + t[k-1]; d += t[k-1]; } } } } for (i = 0; i < N; i++) { table[T][i] = INT_MAX; } table[T][N-1] = 0; for (i = T-1; i >= 0; i--) { for (j = 0; j < N; j++) { int candidates[3] = {INT_MAX, INT_MAX, INT_MAX}; if (table[i+1][j] != INT_MAX) { candidates[0] = table[i+1][j] + 1; } if (0 <= timetable[0][j][i] && timetable[0][j][i] <= T) { candidates[1] = table[timetable[0][j][i]][j+1]; } if (0 <= timetable[1][j][i] && timetable[1][j][i] <= T) { candidates[2] = table[timetable[1][j][i]][j-1]; } table[i][j] = min(candidates[0], min(candidates[1], candidates[2])); } } printf("Case Number %d: ", icase); if (table[0][0] == INT_MAX) { printf("impossible\n"); } else { printf("%d\n", table[0][0]); } } return 0; }