uva1025城市里的间谍

   某城市地铁是线性的,有n(2≤n≤50)个车站,从左到右编号1~n。有M1辆列车从第1站开始往右开,还有M2辆列车从第n站开始往左开。

   列车在相邻站台间所需的运行时间是固定的,因为所有列车的运行速度是相同的。

   在时刻0,Mario从第1站出发,目的在时刻T(0≤T≤200)会见车站n的一个间谍。在车站等车时容易被抓,所以她决定尽量躲在开动的火车上,让在车站等待的时间尽量短。

   列车靠站停车时间忽略不计,且Mario身手敏捷,即时两辆方向不同的列车在同一时间靠站,Mario也能完成换乘。

【输入格式】   输入文件包含数种情况,每一种情况包含以下7行:

         第一行是一个正整数n,表示有n个车站 第二行是为T,表示Mario在时刻T见车站n的间谍 第三行有n-1个整数t1,t2,...,tn-1,其中ti表示地铁从车站i到i+1        的行驶时间 第四行为M1,及从第一站出发向右开的列车数目 第五行包含M1个正整数a1,a2,...,aM1,即个列车出发的时间 第六行为M2,及从第一站出        发向右开的列车数目 第七行包含M2个正整数b1,b2,...,bM2,即个列车出发的时间

        最后一种情况以一行0结尾。

【输出格式】       有若干行,每行先输出“Case Number XXX: ”(XXX为情况编号,从1开始),再输出最少等待时间或“impossible”(无解)。

 

                                                      ——摘抄自刘汝佳《算法竞赛入门经典》

 1. 注意ti表示从i到i+1的时间

 2.   题面t的范围有锅,要开到1e4

  

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int maxn=1e5+5;
 4 const int INF=1e9+7;
 5 int n,m1,m2,T,sum;
 6 bool has[maxn][65][3];
 7 int dp[maxn][65];
 8 int t[205],a[205],b[205];
 9 int cas;
10 template <class t>void red(t &x)
11 {
12     x=0;
13     int w=1;
14     char ch=getchar();
15     while(ch<'0'||ch>'9')
16     {
17         if(ch=='-')
18             w=-1;
19         ch=getchar();
20     }
21     while(ch>='0'&&ch<='9')
22     {
23         x=(x<<3)+(x<<1)+ch-'0';
24         ch=getchar();
25     }
26     x*=w;
27 }
28 void input()
29 {
30     freopen("input.txt","r",stdin);
31 }
32 void DP()
33 {    
34     for(int i=1;i<n;++i)
35         dp[T][i]=INF;
36     dp[T][n]=0;
37     for(int i=T-1;i>=0;--i)
38         for(int j=1;j<=n;++j)
39         {
40             dp[i][j]=dp[i+1][j]+1;
41             int tm1=has[i][j][0];
42             int tm2=has[i][j][1];
43             if(j<n&&tm1&&T>=i+t[j]&&dp[i+t[j]][j+1]<dp[i][j])
44                 dp[i][j]=dp[i+t[j]][j+1];
45             if(j>1&&tm2&&T>=i+t[j-1]&&dp[i+t[j-1]][j-1]<dp[i][j])
46                 dp[i][j]=dp[i+t[j-1]][j-1];    
47         }    
48 }
49 int main()
50 {
51     input();
52     while(scanf("%d",&n)==1&&n)
53     {
54         ++cas;
55         printf("Case Number %d: ",cas);
56         red(T);
57         memset(has,0,sizeof(has));
58         for(int i=1;i<n;++i)
59             red(t[i]);
60         red(m1);
61         for(int j=1;j<=m1;++j)
62         {
63             red(sum);
64             for(int i=1;i<=n;++i)
65             {
66                 has[sum][i][0]=1;
67                 sum+=t[i];
68             }    
69         }
70         red(m2);
71         for(int j=1;j<=m2;++j)
72         {
73             red(sum);
74             for(int i=n;i>=1;--i)
75             {
76                 has[sum][i][1]=1;
77                 sum+=t[i-1];
78             }
79         }    
80         DP();
81         if(dp[0][1]>=INF)
82             printf("impossible\n");
83         else
84             printf("%d\n",dp[0][1]);
85     }
86     return 0;
87 }
View Code

 

posted @ 2019-04-26 17:19  Achen_sy  阅读(297)  评论(0编辑  收藏  举报