• 城市里的间谋


    试题描述

    某城市的地铁是线性的,有 n(2 <= n <= 50)个车站,从左到右编号为 1 到 n。有 M1 辆列车从第 1 站开始往右开,还有 M2 辆列车从第 n 站开始往左开。在时刻 0,Mario 从第 1 站出发,目的是在时刻 T( 0 <= T <= 200 )会见车站 n 的一个间谍。在车站等车时容易被抓,所以她决定尽量躲开在开动的火车上,让在车站等待的总时间尽量短。列车靠站停车时间忽略不计,且 Mario 身手敏捷,即使两辆方向不同的列车在同一时间靠站,Mario也能完成换乘。

    输入
    第一行包含两个数,分别为 n 和 T,第二行有 n-1 个整数,分别为 T1,T2,……,Tn-1,其中 Ti 表示地铁从车站 i 到车站 i+1 行驶的时间(两个方向一样)。第三行为 m,表示从第 1 站出发向右开的列车数目,第四行有 m 个整数,D1,D2,……,Dm(严格递增序列),即各列车的出发时间。第五行和第六行描述从第 n 站出发向左开的列车,格式同第三行和第四行。
    输出
    /*dp[i][j]为第i秒时,间谍在第j个车站
      对于每个状态,有三种决策
      1.等待一秒,dp[i][j]=dp[i+1][j]+1;
      2.这时车站有向右开的车,dp[i][j]=dp[[i+t[j]][j+1];
      3.这时车站有向左开的车,dp[i][j]=dp[i+t[j-1]][j-1];
      处理边界 
    */ 
    #include<iostream>
    #include<cstdio>
    #include<cstdlib>
    #include<cmath>
    #include<algorithm>
    using namespace std;
    int t[60],d1[210],d2[210],dp[210][60];
    int main()
    {
        int n,T,m1,m2;
        scanf("%d%d",&n,&T);
        for(int i=2;i<=n;i++)
        {
            scanf("%d",&t[i]);
            t[i]+=t[i-1];
        }
        scanf("%d",&m1);
        for(int i=1;i<=m1;i++)
        {
            int x;
            scanf("%d",&x);
            d1[x]=1;
        }
        scanf("%d",&m2);
        for(int i=1;i<=m2;i++)
        {
            int y;
            scanf("%d",&y);
            d2[y]=1;
        }
        memset(dp,0x7f,sizeof(dp));
        dp[0][1]=0;
        for(int i=1;i<=T;i++)
        {
            for(int j=1;j<=n;j++)
            {
                dp[i][j]=dp[i-1][j]+1;
                if(j>1 && i>=t[j] && d1[i-t[j]])
                    dp[i][j]=min(dp[i][j],dp[i-(t[j]-t[j-1])][j-1]);
                if(j<n && i>=(t[n]-t[j]) && d2[i-(t[n]-t[j])])
                    dp[i][j]=min(dp[i][j],dp[i-(t[j+1]-t[j])][j+1]);
            }
        }
        if(dp[T][n]>999999999)
            printf("impossible");
        else
            printf("%d",dp[T][n]);
        return 0;
    }
    View Code
    有解时输出一个数,表示最少等待时间;无解时就输出impossible。
    输入示例
    3 185 3 1 15 2 8 16 17 28 31 38 41 75 86 91 128 151 153 171 26 1 2 11 16 31 33 47 50 51 55 56 61 66 67 82 93 94 95 108 112 114 142 145 161 171 183
    输出示例
    123

     

  • 相关阅读:
    在Postgre中设置max_connections时,为什么需要使用连接池 (译)
    既然python的多线程是"伪多线程",那么多线程访问共享资源的时候,还需要线程锁吗
    Debugging: MISCONF Redis is configured to save RDB snapshots(译)
    MySQL集群故障转移的时候在基于python的客户端连接层自动failover实现
    exec: "com.docker.cli": executable file not found in %PATH%
    windows 快捷操作系列
    Docker Build时查看当前镜像目录树
    vs2019生成的dockerfile 手动 build
    Python Records库使用举例
    Jupyter Notebook安装扩充插件与常见问题
  • 原文地址:https://www.cnblogs.com/jason2003/p/6572198.html
Copyright © 2020-2023  润新知