• 洛谷2583 地铁间谍 (UVa1025A Spy in the Metro)


    洛谷2583 地铁间谍(UVa1025A Spy in the Metro)

    本题地址: http://www.luogu.org/problem/show?pid=2583

    题目描述

      特工玛利亚被送到S市执行一个特别危险的任务。她需要利用地铁完成他的任务,S市的地铁只有一条线路运行,所以并不复杂。
      玛利亚有一个任务,现在的时间为0,她要从第一个站出发,并在最后一站的间谍碰头。玛利亚知道有一个强大的组织正在追踪她,她知道如果一直呆在一个车 站,她会有很大的被抓的风险,躲在运行的列车中是比较安全的。所以,她决定尽可能地呆在运行的列车中,她只能往前或往后坐车。
      玛利亚为了能准时且安全的到达最后一个车站与对方碰头,需要知道在在车站最小等待时间总和的计划。你必须写一个程序,得到玛丽亚最短的等待时间。当然,到了终点站之后如果时间还没有到规定的时刻,她可以在车站里等着对方,只不过这个等待的时刻也是要算进去的。
      这个城市有n个车站,编号是1-n,火车是这么移动的:从第一个车站开到最后一个车站。或者从最后一站发车然后开会来。火车在每特定两站之间行驶的时间是固定的,我们也可以忽略停车的时间,玛利亚的速度极快,所以他可以迅速上下车即使两辆车同时到站。

    输入输出格式

    输入格式:

    输入文件包含多组数据,每组数据都由7行组成
    第1行:一个正整数N(2<=N<=50)表示站的数量
    第2行:一个正整数T(0<=T<=200)表示需要的碰头时间
    第3行:1-(n-1)个正整数(0<ti<70)表示两站之间列车的通过时间
    第4行:一个整数M1(1<=M1<=50)表示离开第一个车站的火车的数量
    第5行:M1个正整数:d1,d2……dn,(0<=d<=250且di<di+1)表示每一列火车离开第一站的时间
    第6行:一个正整数M2(1<=M2<=50)表示离开第N站的火车的数量
    第7行:M2个正整数:e1,e2……eM2,(0<=e<=250且ei<ei+1)表示每一列火车离开第N站的时间
    最后一行有一个整数0。

    输出格式:

    对于每个测试案例,打印一行“Case Number N: ”(N从1开始)和一个整数表示总等待的最短时间或者一个单词“impossible”如果玛丽亚不可能做到。按照样例的输出格式。

    输入输出样例

    输入样例#1:

    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

    输出样例#1:

    Case Number 1: 5

    Case Number 2: 0

    Case Number 3: impossible

    说明

    第一组样例说明,她0分钟时上车,在3号站下车,立刻坐上(0分始发)15分开的车回去,到2号车站,立刻坐上(20分始发)25开的车到终点,50分到,还需要等待5分钟。

    【思路】

      DP(时间空间)。

      时间是一个天然的序 =-=,我们设d[i][j]表示时刻i位于车站j所需要等车的最少时间,则有转移式:

        d[i][j]=min{ d[i][j+1]+1,d[i+t[j]][j+1],d[i+t[j-1]][j-1]  }

      根据输入的火车构造hasedge[i][j][k]表示时刻i位于车站j有没有向k走的火车。

    【代码】

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<iostream>
     4 using namespace std;
     5 
     6 const int maxn = 500+10;
     7 const int INF=1e9;
     8 
     9 int d[maxn][maxn],t[maxn];
    10 bool hasedge[maxn][maxn][2];
    11 int n,m1,m2,T;
    12 
    13 int dp(int i,int j) 
    14 {
    15     int& ans=d[i][j];
    16     if(ans) return ans;
    17     if(i==T && j==n) return 0;
    18     if((i>T) || (i==T&&j!=n)) return INF;
    19     
    20     ans=INF;
    21     ans=min(ans,dp(i+1,j)+1);
    22     if(hasedge[i][j][0] && j<n) ans=min(ans,dp(i+t[j],j+1));
    23     if(hasedge[i][j][1] && j>1) ans=min(ans,dp(i+t[j-1],j-1));
    24     return ans;
    25 }
    26 
    27 int main() {
    28     int kase=0;
    29     while(scanf("%d",&n)==1 && n) {
    30         memset(d,0,sizeof(d));
    31         memset(hasedge,0,sizeof(hasedge));
    32         
    33         scanf("%d",&T);
    34         for(int i=1;i<n;i++) scanf("%d",&t[i]);
    35         scanf("%d",&m1);
    36         int st;
    37         for(int i=1;i<=m1;i++) {
    38             scanf("%d",&st);
    39             if(st>T) continue;
    40             for(int j=1;j<=n;j++) {
    41                 hasedge[st][j][0]=1;
    42                 st += t[j];
    43             }
    44         }
    45         scanf("%d",&m2);
    46         for(int i=1;i<=m2;i++) {
    47             scanf("%d",&st);
    48             if(st>T) continue;
    49             for(int j=n;j;j--) {
    50                 hasedge[st][j][1]=1;
    51                 st += t[j-1];
    52             }
    53         }
    54         int ans=dp(0,1);
    55         printf("Case Number %d: ",++kase);
    56         if(ans==INF) printf("impossible
    "); else printf("%d
    ",ans);
    57     }
    58     return 0;
    59 }
  • 相关阅读:
    分布式训练基本原理
    服务化部署框架Paddle Serving
    Paddle Inference原生推理库
    源码编译优化
    推理部署概述
    深度学习模型组网
    在这里
    什么是响应式编程,为什么使用它?
    时间管理:如何充分利用你的24小时-吉姆·兰德尔.pdf
    Win10激活工具
  • 原文地址:https://www.cnblogs.com/lidaxin/p/4929690.html
Copyright © 2020-2023  润新知