UVA1025 城市里的间谍

#include<iostream>
#include<cstdio>
#include<memory.h>
using namespace std;
#define min(a,b) (a)<(b)?(a):(b)
#define INF 0x3f3f3f3f
#define N 55
#define M 220
int k,n,T,M1,M2,a,b;
int t[N];
int f[M][N];
bool trn[M][N][2];
int main(){
    for(;~scanf("%d",&n) && n;){
        k++;
        memset(t,0,sizeof(t));
        memset(trn,0,sizeof(trn));
        scanf("%d",&T);
        for(int i=1;i<n;i++)
           scanf("%d",&t[i]);
        scanf("%d",&M1);
        for(int i=1;i<=M1;i++){
            scanf("%d",&a);
            for(int j=1;j<=n;j++){
                trn[a][j][0]=1;
                a+=t[j];
            }
        }
        scanf("%d",&M2);
        for(int i=1;i<=M2;i++){
            scanf("%d",&b);
            for(int j=n;j>=1;j--){
                trn[b][j][1]=1;
                b+=t[j-1];
            }
        }
        for(int i=1;i<n;i++)
            f[T][i]=INF;
        f[T][n]=0;
        for(int i=T-1;i>=0;i--)
            for(int j=1;j<=n;j++){
                f[i][j]=f[i+1][j]+1;
                if(j<n && trn[i][j][0] && i+t[j]<=T)
                    f[i][j]=min(f[i][j],f[i+t[j]][j+1]);
                if(j>1 && trn[i][j][1] && i+t[j-1]<=T)
                    f[i][j]=min(f[i][j],f[i+t[j-1]][j-1]);
            }
        printf("Case Number %d: ",k);
        if(f[0][1]>=INF)
            printf("impossible\n");
        else printf("%d\n",f[0][1]);
    }
    return 0;
}
/*
4
55
5 10 15
4
0 5 10 20
4
0 5 10 15
4
18
1 2 3
5
0 3 6 10 12
6
0 3 5 7 12 15
2
30
20
1
20
7
1 3 5 7 11 13 17
0
*/
posted @ 2019-03-01 12:01 Pelom 阅读(...) 评论(...) 编辑 收藏