uva 1025



#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;
}

猜你喜欢

转载自blog.csdn.net/a874288174/article/details/79992040