• 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
    ");
    83         else
    84             printf("%d
    ",dp[0][1]);
    85     }
    86     return 0;
    87 }
    View Code
  • 相关阅读:
    Java集合(4):Iterator(迭代器)
    Java集合(3):Vector && Stack
    Java集合(2):LinkedList
    面试题29:顺时针打印矩阵
    面试题28:对称的二叉树
    面试题27:二叉树的镜像
    面试题26:树的子结构
    面试题24:反转链表
    面试题25:合并两个排序的链表
    面试题23:链表中环的入口结点
  • 原文地址:https://www.cnblogs.com/Achensy/p/10775480.html
Copyright © 2020-2023  润新知