zoukankan      html  css  js  c++  java
  • 城市里的间谍B901

    城市里的间谍

     

     

    城市里的间谍

    难度级别:C; 运行时间限制:1000ms; 运行空间限制:51200KB; 代码长度限制:2000000B

    试题描述

    某城市的地铁是线性的,有 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 站出发向左开的列车,格式同第三行和第四行。

    输出

    有解时输出一个数,表示最少等待时间;无解时就输出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

    试题分析

    首先,最容易想到的办法就是把每一站的一种情况都枚举一遍,最后取最优解,但这种情况所需要的情况复杂,而且代码效率低,在时间上和空间上都肯定会超限,所以不可取。

    但是我们可以将代码优化一下,也就是用DP来解决这个问题。最后优化后的代码如下:

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstdlib>
     4 #include<cmath>
     5 #include<algorithm>
     6 using namespace std;
     7 int t[60],d1[210],d2[210],dp[210][60];
     8 int main(){
     9     int n,T,m1,m2;
    10     cin>>n>>T;
    11     for(int i=2;i<=n;i++){
    12         cin>>t[i];
    13         t[i]+=t[i-1];
    14     }
    15     cin>>m1;
    16     for(int i=1;i<=m1;i++){
    17         int x;
    18         cin>>x;
    19         d1[x]=1;
    20     }
    21     cin>>m2;
    22     for(int i=1;i<=m2;i++){
    23         int y;
    24         cin>>y;
    25         d2[y]=1;
    26     }
    27     memset(dp,0x7f,sizeof(dp));
    28     dp[0][1]=0;
    29     for(int i=1;i<=T;i++){
    30         for(int j=1;j<=n;j++){
    31             dp[i][j]=dp[i-1][j]+1;
    32             if(j>1 && i>=t[j] && d1[i-t[j]])
    33                 dp[i][j]=min(dp[i][j],dp[i-(t[j]-t[j-1])][j-1]);
    34             if(j<n && i>=(t[n]-t[j]) && d2[i-(t[n]-t[j])])
    35                 dp[i][j]=min(dp[i][j],dp[i-(t[j+1]-t[j])][j+1]);
    36         }
    37     }
    38     if(dp[T][n]>999999999)
    39         cout<<"impossible";
    40     else
    41         cout<<dp[T][n];
    42     return 0;
    43 }
    44 /*dp[i][j]为第i秒时,间谍在第j个车站
    45   对于每个状态,有三种决策
    46   1.等待一秒,dp[i][j]=dp[i+1][j]+1;
    47   2.这时车站有向右开的车,dp[i][j]=dp[[i+t[j]][j+1];
    48   3.这时车站有向左开的车,dp[i][j]=dp[i+t[j-1]][j-1];
    49   处理边界 
    城市里的间谍

    你——悟到了么?

  • 相关阅读:
    oss blob上传
    app中画一条细线
    antd和原生交互,原生掉前端的方法
    -webkit-touch-callout 图片下载
    ifram嵌入网址 有跨域问题
    ...state
    数组对象的复制
    在vue中使用tinymce组件
    autofs自动挂载服务
    podmen
  • 原文地址:https://www.cnblogs.com/dfzg/p/6533345.html
Copyright © 2011-2022 走看看