zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    Codeforces467C George and Job
    Codeforces205E Little Elephant and Furik and RubikLittle Elephant and Furik and Rubik
    Codeforce205C Little Elephant and Interval
    51nod1829 函数
    51nod1574 排列转换
    nowcoder35B 小AA的数列
    Codeforce893E Counting Arrays
    gym101612 Consonant Fencity
    CodeForces559C Gerald and Giant Chess
    CodeForces456D A Lot of Games
  • 原文地址:https://www.cnblogs.com/Achensy/p/10775480.html
Copyright © 2011-2022 走看看