【题目链接】:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=3466

【题意】



有n个站台;(线性的);

每相邻两个站台之间的火车的行驶时间是固定的;

然后每天在第一个站台会向第n个站台的方向发出m1辆车;

最后一个站台会向第1个站台的方向发出m2辆车;

给出m1辆车是何时发出的,m2辆车是何时发出的(递增顺序给出);

然后有一个人要从1号站台,到n号站台;

且要求在T时刻会面;

可以在站台上等待;

问你它最少需要在站台上等待的时间;(在车上就不占时间);

【题解】



设dp[i][j]表示在第i时刻,在第j个站台所需的最短等待时间;

dp[0][1] = 0,dp[0][2..n]=INF;

在每一个站台有3种可能的决策

1.站在站台不动,时间递增1,站台不变;

2.搭上某一辆车;(向左或向右),时间不变,站台改变;

则有

dp[i][j]=dp[i−1][j]+1;

dp[i][j]=min(dp[i][j],dp[i−t[j]][j+1])

(如果在i−t[j]时刻,j+1站台有向左的车);

dp[i][j]=min(dp[i][j],dp[i−t[j−1]][j−1])

(如果在i−t[j]时刻,j−1站台有向右的车);

在何时在某一站有向左/向右的车可以在读时间的时候就预处理出来;

注意超过T就结束->注意break和continue;

这样DP数组的第一维最大为T,第二维最大为N

最后输出dp[T][n];

当然要判断一下是否有解



【Number Of WA】



3



【反思】



在break和continue的使用上竟然还会出现问题。

Case那个东西要记得输出。



【完整代码】

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define lson l,m,rt<<1
  4. #define rson m+1,r,rt<<1|1
  5. #define LL long long
  6. #define rep1(i,a,b) for (int i = a;i <= b;i++)
  7. #define rep2(i,a,b) for (int i = a;i >= b;i--)
  8. #define mp make_pair
  9. #define pb push_back
  10. #define fi first
  11. #define se second
  12. #define ms(x,y) memset(x,y,sizeof x)
  13. #define Open() freopen("F:\\rush.txt","r",stdin)
  14. #define Close() ios::sync_with_stdio(0)
  15. typedef pair<int,int> pii;
  16. typedef pair<LL,LL> pll;
  17. const int dx[9] = {0,1,-1,0,0,-1,-1,1,1};
  18. const int dy[9] = {0,0,0,-1,1,-1,1,-1,1};
  19. const double pi = acos(-1.0);
  20. const int N = 50;
  21. const int MAXT = 200;
  22. const int INF = 0x3f3f3f3f;
  23. int n,T,t[N+10],has[200+10][N+10][2];
  24. int m,dp[MAXT+10][N+10];
  25. int main(){
  26. //Open();
  27. //Close();
  28. int kk = 0;
  29. while (~scanf("%d",&n)){
  30. if (n==0) break;
  31. kk++;
  32. ms(has,0),ms(dp,INF);
  33. scanf("%d",&T);
  34. rep1(i,1,n-1)
  35. scanf("%d",&t[i]);
  36. scanf("%d",&m);
  37. rep1(i,1,m){
  38. int now;scanf("%d",&now);
  39. if (now>T) continue;
  40. has[now][1][0] = 1;
  41. rep1(j,1,n-1){
  42. now+=t[j];
  43. if (now>T) break;
  44. has[now][j+1][0] = 1;
  45. }
  46. }
  47. scanf("%d",&m);
  48. rep1(i,1,m){
  49. int now;scanf("%d",&now);
  50. if (now>T) continue;
  51. has[now][n][1] = 1;
  52. rep2(j,n-1,1){
  53. now+=t[j];
  54. if (now>T) break;
  55. has[now][j][1] = 1;
  56. }
  57. }
  58. dp[0][1] = 0;
  59. rep1(i,2,n) dp[0][i] = INF;
  60. rep1(i,1,T)
  61. rep1(j,1,n){
  62. dp[i][j] = dp[i-1][j] + 1;
  63. if (j+1<=n && i-t[j]>=0 && has[i-t[j]][j+1][1]) // <-
  64. dp[i][j] = min(dp[i][j],dp[i-t[j]][j+1]);
  65. if (j-1>=1 && i-t[j-1]>=0 && has[i-t[j-1]][j-1][0]) // ->
  66. dp[i][j] = min(dp[i][j],dp[i-t[j-1]][j-1]);
  67. }
  68. cout << "Case Number "<<kk<<": ";
  69. if (dp[T][n]>=INF)
  70. cout <<"impossible"<<endl;
  71. else
  72. cout << dp[T][n] << endl;
  73. }
  74. return 0;
  75. }

【uva 1025】A Spy in the Metro的更多相关文章

  1. UVa 1025 (动态规划) A Spy in the Metro

    题意: 有线性的n个车站,从左到右编号分别为1~n.有M1辆车从第一站开始向右开,有M2辆车从第二站开始向左开.在0时刻主人公从第1站出发,要在T时刻回见车站n 的一个间谍(忽略主人公的换乘时间).输 ...

  2. 【巧妙算法系列】【Uva 11464】 - Even Parity 偶数矩阵

    偶数矩阵(Even Parity, UVa 11464) 给你一个n×n的01矩阵(每个元素非0即1),你的任务是把尽量少的0变成1,使得每个元素的上.下.左.右的元素(如果存在的话)之和均为偶数.比 ...

  3. 【贪心+中位数】【UVa 11300】 分金币

    (解方程建模+中位数求最短累积位移) 分金币(Spreading the Wealth, UVa 11300) 圆桌旁坐着n个人,每人有一定数量的金币,金币总数能被n整除.每个人可以给他左右相邻的人一 ...

  4. 【UVa 10881】Piotr's Ants

    Piotr's Ants Porsition:Uva 10881 白书P9 中文改编题:[T^T][FJUT]第二届新生赛真S题地震了 "One thing is for certain: ...

  5. 【UVa 116】Unidirectional TSP

    [Link]:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_probl ...

  6. 【UVa 1347】Tour

    [Link]:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_probl ...

  7. 【UVA 437】The Tower of Babylon(记忆化搜索写法)

    [题目链接]:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_probl ...

  8. 【BZOJ 1025】[SCOI2009]游戏

    [题目链接]:http://www.lydsy.com/JudgeOnline/problem.php?id=1025 [题意] [题解] 每一个对应关系,里面其实都会生成大小不一的几个环. 每一个环 ...

  9. 【Uva 11584】Partitioning by Palindromes

    [Link]:https://cn.vjudge.net/contest/170078#problem/G [Description] 给你若干个只由小写字母组成的字符串; 问你,这个字符串,最少能由 ...

随机推荐

  1. APICloud关闭Key Building Resolve

    顶部菜单 --> 扩展 --> keybinding resolver --> toggle

  2. utf8 string

    https://github.com/BassLC/idUTF8lib Idiot's UTF-8 Library A very (too much really) simple Utf8 libra ...

  3. 复制excel表,往excel表中写入数据

    import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import jav ...

  4. 洛谷P3355 骑士共存问题 二分图_网络流

    Code: #include<cstdio> #include<cstring> #include<queue> #include<vector> #i ...

  5. 第三方-FastDFS分布式文件系统

    1.什么是FastDFS? FastDFS 是用 c 语言编写的一款开源的分布式文件系统.FastDFS 为互联网量身定制, 充分考虑了冗余备份.负载均衡.线性扩容等机制,并注重高可用.高性能等指标, ...

  6. luogu P3765 总统选举(线段树维护摩尔投票+平衡树)

    这题需要一个黑科技--摩尔投票.这是一个什么东西?一个神奇的方法求一个序列中出现次数大于长度一半的数. 简而言之就是同加异减: 比如有一个代表投票结果的序列. \[[1,2,1,1,2,1,1]\] ...

  7. PL SQL Developer使用总结

    如果OS为windows 7 64位系统,Oracle版本为 Oracle 11g 64 安装PL SQL Developer 请参考    http://myskynet.blog.51cto.co ...

  8. POJ——T1860 Currency Exchange

    http://poj.org/problem?id=1860 Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 29874   ...

  9. NSTimer解除循环引用

    NSTimer作为一个经常使用的类,却有一个最大的弊病,就是会强引用target.造成调用timer很麻烦.稍有不慎就造成内存泄漏. 下面就是为解决问题做的封装. 直接上代码: #import < ...

  10. 10、匿名内部类、枚举类、日期、Math、Random、String、equals、StringBuffer、包装类、对象数组、克隆,标准输出3

    1对象的克隆(clone) 单纯的同类的两个对象a0 a00,a0=a00只是栈指向同一个堆,而不是开辟两个新堆,修改其中一个,另一个也会受牵连. 需要重写Clone()方法,并且实现Cloneabl ...