uva 1025 A Spy int the Metro

https://vjudge.net/problem/UVA-1025

    看见spy忍俊不禁的想起省赛时不知道spy啥意思 ( >_<

    f[i][j]表示i时刻处于j站所需的最少等待时间,有三种可能,一是i-1时刻就在这里然后等待了1时刻  f[i][j]=f[i-1][j]+1  ; 二是正好由由左边相邻的一个车站开过来(如果可以的话)  f[i][j]=f[i-t[j-1]][j-1];  三是正好由右边的车站开过来(if can) f[i][j]=f[i-t[j]][j+1]; 取三者的最小值就好,最后如果f[T][N]>=inf表示impossible.

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define inf 0x3f3f3f3f
 4 int t[55],tl[55],tr[55];
 5 int f[255][55];
 6 bool can[255][55][2];
 7 int main()
 8 {
 9     int N,T,M1,M2,i,j,k=0;
10     while(cin>>N&&N){
11         cin>>T;
12         for(i=1;i<N;++i) scanf("%d",t+i);
13         memset(f,inf,sizeof(f));
14         memset(can,0,sizeof(can));
15         cin>>M1;
16         for(i=1;i<=M1;++i)
17         {
18             int s;
19             scanf("%d",tl+i);
20             for(j=1,s=tl[i];j<=N&&s<=T;s+=t[j++])
21             {
22                 can[s][j][0]=1;
23             }
24         }
25         cin>>M2;
26         for(i=1;i<=M2;++i)
27         {
28             int s;
29             scanf("%d",tr+i);
30             for(j=N,s=tr[i];j>=1&&s<=T;s+=t[j-1],j--)
31                 can[s][j][1]=1;
32         }
33         f[0][1]=0;
34         for(i=1;i<=T;++i)
35         {
36             for(j=1;j<=N;++j)
37             {
38                 f[i][j]=f[i-1][j]+1;
39                 if(j>1&&i-t[j-1]>=0&&can[i-t[j-1]][j-1][0])
40                   f[i][j]=min(f[i][j],f[i-t[j-1]][j-1]);
41                 if(j<N&&i-t[j]>=0&&can[i-t[j]][j+1][1])
42                   f[i][j]=min(f[i][j],f[i-t[j]][j+1]);
43             }
44         }
45         printf("Case Number %d: ",++k);
46         if(f[T][N]>=inf) puts("impossible");
47         else cout<<f[T][N]<<endl;
48     }
49     return 0;
50 }
51 /*
52 4
53 55
54 5 10 15
55 4
56 0 5 10 20
57 4
58 0 5 10 15
59 
60 ans=5
61 */

 

posted @ 2017-09-06 17:44  *zzq  阅读(152)  评论(0编辑  收藏  举报