【uva 1025】A Spy in the Metro
【题目链接】: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那个东西要记得输出。
【完整代码】
#include <bits/stdc++.h>
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define LL long long
#define rep1(i,a,b) for (int i = a;i <= b;i++)
#define rep2(i,a,b) for (int i = a;i >= b;i--)
#define mp make_pair
#define pb push_back
#define fi first
#define se second
#define ms(x,y) memset(x,y,sizeof x)
#define Open() freopen("F:\\rush.txt","r",stdin)
#define Close() ios::sync_with_stdio(0)
typedef pair<int,int> pii;
typedef pair<LL,LL> pll;
const int dx[9] = {0,1,-1,0,0,-1,-1,1,1};
const int dy[9] = {0,0,0,-1,1,-1,1,-1,1};
const double pi = acos(-1.0);
const int N = 50;
const int MAXT = 200;
const int INF = 0x3f3f3f3f;
int n,T,t[N+10],has[200+10][N+10][2];
int m,dp[MAXT+10][N+10];
int main(){
//Open();
//Close();
int kk = 0;
while (~scanf("%d",&n)){
if (n==0) break;
kk++;
ms(has,0),ms(dp,INF);
scanf("%d",&T);
rep1(i,1,n-1)
scanf("%d",&t[i]);
scanf("%d",&m);
rep1(i,1,m){
int now;scanf("%d",&now);
if (now>T) continue;
has[now][1][0] = 1;
rep1(j,1,n-1){
now+=t[j];
if (now>T) break;
has[now][j+1][0] = 1;
}
}
scanf("%d",&m);
rep1(i,1,m){
int now;scanf("%d",&now);
if (now>T) continue;
has[now][n][1] = 1;
rep2(j,n-1,1){
now+=t[j];
if (now>T) break;
has[now][j][1] = 1;
}
}
dp[0][1] = 0;
rep1(i,2,n) dp[0][i] = INF;
rep1(i,1,T)
rep1(j,1,n){
dp[i][j] = dp[i-1][j] + 1;
if (j+1<=n && i-t[j]>=0 && has[i-t[j]][j+1][1]) // <-
dp[i][j] = min(dp[i][j],dp[i-t[j]][j+1]);
if (j-1>=1 && i-t[j-1]>=0 && has[i-t[j-1]][j-1][0]) // ->
dp[i][j] = min(dp[i][j],dp[i-t[j-1]][j-1]);
}
cout << "Case Number "<<kk<<": ";
if (dp[T][n]>=INF)
cout <<"impossible"<<endl;
else
cout << dp[T][n] << endl;
}
return 0;
}
【uva 1025】A Spy in the Metro的更多相关文章
- UVa 1025 (动态规划) A Spy in the Metro
题意: 有线性的n个车站,从左到右编号分别为1~n.有M1辆车从第一站开始向右开,有M2辆车从第二站开始向左开.在0时刻主人公从第1站出发,要在T时刻回见车站n 的一个间谍(忽略主人公的换乘时间).输 ...
- 【巧妙算法系列】【Uva 11464】 - Even Parity 偶数矩阵
偶数矩阵(Even Parity, UVa 11464) 给你一个n×n的01矩阵(每个元素非0即1),你的任务是把尽量少的0变成1,使得每个元素的上.下.左.右的元素(如果存在的话)之和均为偶数.比 ...
- 【贪心+中位数】【UVa 11300】 分金币
(解方程建模+中位数求最短累积位移) 分金币(Spreading the Wealth, UVa 11300) 圆桌旁坐着n个人,每人有一定数量的金币,金币总数能被n整除.每个人可以给他左右相邻的人一 ...
- 【UVa 10881】Piotr's Ants
Piotr's Ants Porsition:Uva 10881 白书P9 中文改编题:[T^T][FJUT]第二届新生赛真S题地震了 "One thing is for certain: ...
- 【UVa 116】Unidirectional TSP
[Link]:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_probl ...
- 【UVa 1347】Tour
[Link]:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_probl ...
- 【UVA 437】The Tower of Babylon(记忆化搜索写法)
[题目链接]:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_probl ...
- 【BZOJ 1025】[SCOI2009]游戏
[题目链接]:http://www.lydsy.com/JudgeOnline/problem.php?id=1025 [题意] [题解] 每一个对应关系,里面其实都会生成大小不一的几个环. 每一个环 ...
- 【Uva 11584】Partitioning by Palindromes
[Link]:https://cn.vjudge.net/contest/170078#problem/G [Description] 给你若干个只由小写字母组成的字符串; 问你,这个字符串,最少能由 ...
随机推荐
- BootStrap学习(二)——重写首页之topbar
1.布局容器 帮助文档:http://v3.bootcss.com/css/#overview-container BootStrap需要为页面内容和栅栏系统包裹一个.container容器.提供的两 ...
- python编程基础
Date: 2019-05-27 Author: Sun 1. 程序 为了完成某种特定功能,以某种程序设计语言编写的有序指令的集合.程序是指挥cpu工作的"工作手册".计算机只能执 ...
- DCDCBigBig's first blog @cnblogs~
其实初二末的时候我就在CSDN上开了博客(主要是为了存模板),但是无奈CSDN的页面真的太辣眼睛了…… 然后我就加入博客园欢快的大家庭啦!!!顺便膜拜巨佬学长%%%(我是蒟蒻不要喷我) 页面设置感谢x ...
- UE4.18.3 C++项目无法打开C++类问题(VS2017)
升级VS2017后,突然出现UE4创建C++项目无法打开VS问题.经过测试为VS2017升级后C++的桌面开发工具集采用了VC++2017 v141工具集,而UE4对该工具集尚未兼容,故找不到vs打开 ...
- Python求阴影部分面积
一.前言说明 今天看到微信群里一道六年级数学题,如下图,求阴影部分面积 看起来似乎并不是很难,可是博主添加各种辅助线,写各种方法都没出来,不得已而改用写Python代码来求面积了 二.思路介绍 1.用 ...
- Geany IDE搭建
http://blog.sina.com.cn/s/blog_567e650201010x5e.html
- hadoop-14-进行libtirpc的rpm包安装
hadoop-14-进行libtirpc的rpm包安装 安装过程中出现了这个问题,进行安装: yum localinstall --nogpgcheck libtirpc-0.2.1-13.el6.x ...
- hdu_5154 拓扑
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #i ...
- hpuoj--校赛--爬楼梯(模拟)
问题 E: 感恩节KK专场--爬楼梯 时间限制: 1 Sec 内存限制: 1000 MB 提交: 382 解决: 89 [提交][状态][讨论版] 题目描述 来机房比赛的时候大家都会爬楼梯,但是每 ...
- matplotlib 可视化 —— 绘制常见图形
0. 饼状图 plt.pie():Python数据可视化:饼状图 1. 三角形 描点连线,起点和终点相同 triangle1 = ((0, sqrt(3)/2), (1, 3*sqrt(3)/2), ...