zoukankan      html  css  js  c++  java
  • UVa 1025 A Spy in the Metro (DP)

    题目

    题目描述

    某城市地铁是线性的,有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”(无解)。

    输入输出样例

    输入样例
    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
    
    输出样例
    Case Number 1: 5
    Case Number 2: 0
    Case Number 3: impossible
    

    题解

    紫书经典DP, 比较基础就不说了

    代码

    #include <iostream>
    #include <cstring>
    #include <algorithm>
    const int kInfinity(0x3f3f3f3f);
    int n, T, M1, M2, kase;
    int t[55];
    bool trainl[55][10010];
    bool trainr[55][10010];
    int dp[10010][55];
    int main(){
      while (std::cin >> n && n) {
        kase++;
        std::cin >> T;
        memset(t, 0, sizeof(t));
        memset(trainl, 0, sizeof(trainl));
        memset(trainr, 0, sizeof(trainr));
        for (register int i(1); i < n; ++i) std::cin >> t[i];
        std::cin >> M1;
        for (register int i(1); i <= M1; ++i) {
          register int t1;
          std::cin >> t1;
          register int sum(t1);
          for (register int j(1); j <= n; ++j) {
            trainl[j][sum] = 1;
            sum += t[j];
          }
        }
        std::cin >> M2;
        for (register int i(1); i <= M2; ++i) {
          register int t2;
          std::cin >> t2;
          register int sum(t2);
          for (register int j(n); j >= 1; --j) {
            trainr[j][sum] = 1;
            sum += t[j - 1];
          }
        }
        for (register int i(1); i < n; ++i)
          dp[T][i] = kInfinity;
        dp[T][n] = 0;
        for (register int i(T-1); i >= 0; --i)
          for (register int j(1); j <= n; ++j) {
            dp[i][j] = dp[i + 1][j] + 1;
            if (j < n && trainl[j][i] && i + t[j] <= T)
              dp[i][j] = std::min(dp[i][j], dp[i + t[j]][j + 1]);
            if (j > 1 && trainr[j][i] && i + t[j - 1] <= T)
              dp[i][j] = std::min(dp[i][j], dp[i + t[j - 1]][j - 1]);
        }
        std::cout << "Case Number " << kase << ": ";
        if (dp[0][1] >= kInfinity) std::cout << "impossible
    ";
        else std::cout << dp[0][1] << "
    ";
        }
        return 0;
    }
    

    其它

  • 相关阅读:
    bzoj 2744 朋友圈
    bzoj 3674 可持久化并查集加强版
    3.15 模拟赛
    luogu 4720 【模板】扩展卢卡斯
    洛谷 P1447 [NOI2010]能量采集 (莫比乌斯反演)
    洛谷P2522 [HAOI2011]Problem b (莫比乌斯反演+容斥)
    7-12 与零交换 (25 分)
    理想的正方形(单调队列)
    Flowerpot(单调队列)
    生日礼物(单调队列)
  • 原文地址:https://www.cnblogs.com/forth/p/9696493.html
Copyright © 2011-2022 走看看