当前位置: 首页 > news >正文

UVA1025 城市里的间谍 A Spy in the Metro

UVA1025 城市里的间谍 A Spy in the Metro

题面翻译

题目大意

某城市地铁是一条直线,有 n n n 2 ≤ n ≤ 50 2\leq n\leq 50 2n50)个车站,从左到右编号 1 … n 1\ldots n 1n。有 M 1 M_1 M1 辆列车从第 1 1 1 站开始往右开,还有 M 2 M_2 M2 辆列车从第 n n n 站开始往左开。列车在相邻站台间所需的运行时间是固定的,因为所有列车的运行速度是相同的。在时刻 0 0 0,Mario 从第 1 1 1 站出发,目的在时刻 T T T 0 ≤ T ≤ 200 0\leq T\leq 200 0T200)会见车站 n n n 的一个间谍。在车站等车时容易被抓,所以她决定尽量躲在开动的火车上,让在车站等待的时间尽量短。列车靠站停车时间忽略不计,且 Mario 身手敏捷,即使两辆方向不同的列车在同一时间靠站,Mario 也能完成换乘。

输入格式

输入文件包含多组数据。

每一组数据包含以下 7 7 7 行:

第一行是一个正整数 n n n,表示有 n n n 个车站。

第二行是为 T T T,表示 Mario 在时刻 T T T 会见车站 n n n 的间谍。

第三行有 n − 1 n-1 n1 个整数 t 1 , t 2 , … , t n − 1 t_1,t_2,\ldots,t_{n-1} t1,t2,,tn1,其中 t i t_i ti 表示地铁从车站 i i i i + 1 i+1 i+1 的行驶时间。

第四行为 M 1 M_1 M1,及从第一站出发向右开的列车数目。

第五行包含 M 1 M_1 M1 个正整数 a 1 , a 2 , … , a M 1 a_1,a_2,\ldots,a_{M_1} a1,a2,,aM1,即每个列车出发的时间。

第六行为 M 2 M_2 M2 ,即从第 n n n 站出发向左开的列车数目。

第七行包含 M 2 M_2 M2 个正整数 b 1 , b 2 , … , b M 2 b_1,b_2,\ldots,b_{M_2} b1,b2,,bM2,即每个列车出发的时间。

输入文件以一行 0 0 0 结尾。

输出格式

有若干行,每行先输出 Case Number XXX : (XXX为情况编号,从 1 1 1 开始),再输出最少等待时间或 impossible(无解)。

题目描述

PDF

输入格式

输出格式

样例 #1

样例输入 #1

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

样例输出 #1

Case Number 1: 5
Case Number 2: 0
Case Number 3: impossible

Solution

采用动态规划算法

dp[i][j]代表第i时刻到在第j站的等待的时间,因为要在T时间内达到第n站,且要求尽可能多的时间在地铁上度过,由此可以知要求dp[T][n]=0,通过逆向递推建立状态转移方程,可以得到以下三种情况

  1. dp[i][j]=dp[i+1][j]+1,即dp[i][j] 为在i+1时刻在第j站的所等待的时间+1
  2. dp[i][j]=min(dp[i+t[j]][j+1],dp[i][j]),即若第i时刻存在向右开的车,且此时到达下一个站的时间不大于T时,dp[i][j]为第i+t[j]时刻在第j+1站台所等待的时间与在在这个站台等待的时间点最小值
  3. dp[i][j]=min(dp[i+t[j-1]][j-1],dp[i][j]),即若第i时刻存在向左开的车,且此时到达下一个站的时间不大于T时,dp[i][j]为第i+t[j-1]时刻在第j-1站台所等待的时间与在在这个站台等待的时间点最小值

然后最终等待时间为dp[0][1],即在0时刻在1站台时等待的时间

//
// Created by Gowi on 2023/11/23.
//#include <iostream>
#include <cstring>#define maxN 100
#define MaxT 300
#define INF 1000000000using namespace std;int T, t[maxN], a[maxN], b[maxN], M1, M2, n;
int has_train[MaxT][maxN][2];// has_train[i][j][1/2] i时刻在第j个站是否有向右(0)/左(1)开的火车
int dp[MaxT][maxN]; //dp[i][j]i时刻在第j个站需要等待多长时间bool init() {int d;cin >> n;if (n == 0) {return false;}memset(t, 0, sizeof(t));memset(a, 0, sizeof(a));memset(b, 0, sizeof(b));memset(has_train, 0, sizeof(has_train));memset(dp, 0, sizeof(dp));cin >> T;for (int i = 1; i < n; ++i) {cin >> t[i];}cin >> M1;for (int i = 1; i <= M1; ++i) {cin >> a[i];d = a[i];for (int j = 1; j < n; ++j) {has_train[d][j][0] = 1;d += t[j];}}cin >> M2;for (int i = 1; i <= M2; ++i) {cin >> b[i];d = b[i];for (int j = n - 1; j > 0; j--) {has_train[d][j+1][1] = 1;d += t[j];}}return true;
}int main() {int k = 0;while (init()) {for (int i = 1; i < n; ++i) {dp[T][i] = INF;}dp[T][n] = 0;for (int i = T - 1; i >= 0; i--) {for (int j = 1; j <= n; ++j) {dp[i][j] = dp[i + 1][j] + 1; // 等待一分钟if (j < n && has_train[i][j][0] && i + t[j] <= T) { //若此时向右有车,且到达下一个站的时间不大于Tdp[i][j] = min(dp[i][j], dp[i + t[j]][j + 1]); //状态转移方程}if (j > 1 && has_train[i][j][1] && i + t[j-1] <= T) { //若此时向左有车,且到达下一个站的时间不大于Tdp[i][j] = min(dp[i][j], dp[i + t[j - 1]][j - 1]); //状态转移方程}}}cout << "Case Number " << ++k << ": ";if (dp[0][1] >= INF) {cout << "impossible" << endl;} else {cout << dp[0][1] << endl;}}return 0;
}
http://www.lryc.cn/news/241894.html

相关文章:

  • 【科普知识】什么是步进电机?
  • AWS云服务器EC2实例实现ByConity快速部署
  • Docker的项目资源参考
  • wsl-ubuntu 系统端口总被主机端口占用问题解决
  • 详解自动化之单元测试工具Junit
  • 超声波雪深传感器冬季里的科技魔法
  • 2023年【熔化焊接与热切割】免费试题及熔化焊接与热切割模拟考试
  • 【数据结构】—搜索二叉树(C++实现,超详细!)
  • 机器人算法—ROS TF坐标变换
  • 路由VRRP配置例子
  • OpenGL 绘制点与三角形(Qt)
  • 究竟什么是阻塞与非阻塞、同步与异步
  • Openlayer【三】—— 绘制多边形GeoJson边界绘制
  • 用SOLIDWORKS画个高尔夫球,看似简单的建模却大有学问
  • Linux:Network: ARP被动删除的一个情况
  • 『接口测试干货』| Newman+Postman接口自动化测试完整过程
  • 根据商品链接获取拼多多商品详情数据接口|拼多多商品详情价格数据接口|拼多多API接口
  • KaiwuDB 监控组件及辅助 SQL 调优介绍
  • 双11再创新高!家电行业如何通过矩阵管理,赋能品牌增长?
  • 苏东坡最经典的诗词
  • iterator遍历赋值
  • 【从删库到跑路】MySQL数据库 — E-R图 | 关系模型
  • 网工内推 | 美的、得力集团,包吃包住,IE认证优先,14薪
  • java springboot在测试类中构建虚拟MVC环境并发送请求
  • python运算符重载之字符串显示和右侧加法
  • 卷积神经网络(AlexNet)鸟类识别
  • hive 报错return code 40000 from org.apache.hadoop.hive.ql.exec.MoveTask解决思路
  • Java Web——XML
  • 【.NET Core】Task应用详解
  • convertRect:toView 方法注意事项