#include<cstdio> #include<cstring> #include<algorithm> #include<cstdlib> #include<iostream> #include<queue> #include<vector> #include<sstream> #include<cmath> #include<queue> #include<cctype> #include<set> #include<unordered_set> using namespace std; const int maxn = 500+5, maxc = 2500 + 10, inf = 999999; int N, T; int t[maxn], train[maxc][maxn][2]; int d[maxc][maxn]; void read_input(){ memset(train,0,sizeof(train)); int departingtime, Left, Right; scanf("%d",&T); for(int i = 0; i < N-1; i++) scanf("%d",&t[i]); scanf("%d",&Left); for(int i = 0; i < Left; i++){ scanf("%d",&departingtime); for(int j = 0; j < N-1; j++){ train[departingtime][j][0] = 1; departingtime += t[j]; } } scanf("%d",&Right); for(int i = 0; i < Right; i++){ scanf("%d",&departingtime); for(int j = N-1; j > 0; j--){ train[departingtime][j][1] = 1; departingtime += t[j-1]; } } } void solve(){ d[T][N-1] = 0; for(int j = 0; j < N-1; j++) d[T][j] = inf; for(int i = T-1; i >= 0; i--) for(int j = 0; j < N; j++){ d[i][j] = d[i+1][j] + 1; if( j < N-1 && train[i][j][0] && i + t[j] <= T ) d[i][j] = min(d[i][j],d[i+t[j]][j+1] ); if( j > 0 && train[i][j][1] && i + t[j-1] <= T ) d[i][j] = min(d[i][j],d[i+t[j-1]][j-1] ); } } int main(){ int kase = 1; while(scanf("%d",&N) == 1 && N){ read_input(); solve(); printf("Case Number %d: ",kase++); if(d[0][0] < inf ) printf("%d\n",d[0][0]); else printf("impossible\n"); } return 0; }
uva 1025
猜你喜欢
转载自blog.csdn.net/a874288174/article/details/79992040
今日推荐
周排行