【luogu2583】地铁间谍

题目描述

特工玛利亚被送到S市执行一个特别危险的任务。她需要利用地铁完成他的任务,S市的地铁只有一条线路运行,所以并不复杂。

玛利亚有一个任务,现在的时间为0,她要从第一个站出发,并在最后一站的间谍碰头。玛利亚知道有一个强大的组织正在追踪她,她知道如果一直呆在一个车站,她会有很大的被抓的风险,躲在运行的列车中是比较安全的。所以,她决定尽可能地呆在运行的列车中,她只能往前或往后坐车。

玛利亚为了能准时且安全的到达最后一个车站与对方碰头,需要知道在在车站最小等待时间总和的计划。你必须写一个程序,得到玛丽亚最短的等待时间。当然,到了终点站之后如果时间还没有到规定的时刻,她可以在车站里等着对方,只不过这个等待的时刻也是要算进去的。

这个城市有n个车站,编号是1-n,火车是这么移动的:从第一个车站开到最后一个车站。或者从最后一站发车然后开会来。火车在每特定两站之间行驶的时间是固定的,我们也可以忽略停车的时间,玛利亚的速度极快,所以他可以迅速上下车即使两辆车同时到站。

输入输出格式

输入格式:

输入文件包含多组数据,每组数据都由7行组成

第1行:一个正整数N(2<=N<=50)表示站的数量

第2行:一个正整数T(0<=T<=200)表示需要的碰头时间

第3行:1-(n-1)个正整数(0<ti<70)表示两站之间列车的通过时间

第4行:一个整数M1(1<=M1<=50)表示离开第一个车站的火车的数量

第5行:M1个正整数:d1,d2……dn,(0<=d<=250且di<di+1)表示每一列火车离开第一站的时间

第6行:一个正整数M2(1<=M2<=50)表示离开第N站的火车的数量

第7行:M2个正整数:e1,e2……eM2,(0<=e<=250且ei<ei+1)表示每一列火车离开第N站的时间

最后一行有一个整数0。

输出格式:

对于每个测试案例,打印一行“Case Number N: ”(N从1开始)和一个整数表示总等待的最短时间或者一个单词“impossible”如果玛丽亚不可能做到。按照样例的输出格式。

输入输出样例

输入样例#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

说明

第一组样例说明,她0分钟时上车,在3号站下车,立刻坐上(0分始发)15分开的车回去,到2号车站,立刻坐上(20分始发)25开的车到终点,50分到,还需要等待5分钟。

题解

设在时刻i,车站j到结束最短需要等待f(i,j)分钟,得状态转移方程:

f(i,j)=min{
     f(i+1,j)+1
     f(i+t[j-1],j-1) (若时刻i有向左走的车)
     f(i+t[j],j+1) (若时刻i有向右走的车)

}

 1 #include <iostream>
 2 #include <cstring>
 3 #define maxt 210
 4 #define maxn 60
 5 #define inf 1000
 6 using namespace std;
 7 bool has_train[maxt][maxn][2];
 8 int dp[maxt][maxn];
 9 int n, tt, t[maxn], m1, m2, d;
10 int main()
11 {
12     int cnt = 1;
13     while (true)
14     {
15         cin >> n;
16         if (n == 0) break;
17         cin >> tt;
18         for (int i = 1; i<n; i++) cin >> t[i];
19
20         //预处理has_train数组
21         memset(has_train, false, maxt * maxn * 2);
22         cin >> m1;
23         while (m1--)
24         {
25             cin >> d;
26             for (int j = 1; j <= n - 1 && d <= tt; j++)
27             {
28                 has_train[d][j][0] = true;
29                 d += t[j];
30             }
31         }
32         cin >> m2;
33         while (m2--)
34         {
35             cin >> d;
36             for (int j = n; j >= 2 && d <= tt; j--)
37             {
38                 has_train[d][j][1] = true;
39                 d += t[j - 1];
40             }
41         }
42
43         //初始化dp数组
44         for (int i = 1; i <= n; i++)
45             dp[tt][i] = inf;
46         dp[tt][n] = 0;
47
48         for (int i = tt - 1; i >= 0; i--)
49         {
50             for (int j = 1; j <= n; j++)
51             {
52                 dp[i][j] = dp[i + 1][j] + 1; //+1s
53                 if (i + t[j] <= tt && j + 1 <= n && has_train[i][j][0])
54                     dp[i][j] = min(dp[i][j], dp[i + t[j]][j + 1]); //向右走
55                 if (i + t[j - 1] <= tt && j - 1 >= 1 && has_train[i][j][1])
56                     dp[i][j] = min(dp[i][j], dp[i + t[j - 1]][j - 1]); //向左走
57             }
58         }
59         if (dp[0][1]<inf)
60             cout << "Case Number " << cnt << ": " << dp[0][1] << endl;
61         else
62             cout << "Case Number " << cnt << ": impossible" << endl;
63         cnt++;
64     }
65     return 0;
66 }
时间: 2024-07-28 23:36:29

【luogu2583】地铁间谍的相关文章

洛谷2583 地铁间谍 (UVa1025A Spy in the Metro)

洛谷2583 地铁间谍(UVa1025A Spy in the Metro) 本题地址:http://www.luogu.org/problem/show?pid=2583 题目描述 特工玛利亚被送到S市执行一个特别危险的任务.她需要利用地铁完成他的任务,S市的地铁只有一条线路运行,所以并不复杂. 玛利亚有一个任务,现在的时间为0,她要从第一个站出发,并在最后一站的间谍碰头.玛利亚知道有一个强大的组织正在追踪她,她知道如果一直呆在一个车 站,她会有很大的被抓的风险,躲在运行的列车中是比较安全的.

地铁间谍(洛谷 2583)

题目描述 特工玛利亚被送到S市执行一个特别危险的任务.她需要利用地铁完成他的任务,S市的地铁只有一条线路运行,所以并不复杂. 玛利亚有一个任务,现在的时间为0,她要从第一个站出发,并在最后一站的间谍碰头.玛利亚知道有一个强大的组织正在追踪她,她知道如果一直呆在一个车站,她会有很大的被抓的风险,躲在运行的列车中是比较安全的.所以,她决定尽可能地呆在运行的列车中,她只能往前或往后坐车. 玛利亚为了能准时且安全的到达最后一个车站与对方碰头,需要知道在在车站最小等待时间总和的计划.你必须写一个程序,得到

算法竞赛入门经典--例题和课后训练(动态规划)

1.地铁间谍(逆序推导时间法) 特工玛利亚被送到S市执行一个特别危险的任务.她需要利用地铁完成他的任务,S市的地铁只有一条线路运行,所以并不复杂. 玛利亚有一个任务,现在的时间为0,她要从第一个站出发,并在最后一站的间谍碰头.玛利亚知道有一个强大的组织正在追踪她,她知道如果一直呆在一个车站,她会有很大的被抓的风险,躲在运行的列车中是比较安全的.所以,她决定尽可能地呆在运行的列车中,她只能往前或往后坐车. 玛利亚为了能准时且安全的到达最后一个车站与对方碰头,需要知道在在车站最小等待时间总和的计划.

uva 1025,城市的间谍

题目链接:https://uva.onlinejudge.org/external/10/1025.pdf 题意: 地铁是线性的,有n个站,编号(1~n),M1辆从左至右的车,和M2辆从右至左的车,发车时刻给出,然后是,每两个站之间要跑多长时间.一个间谍要从1车站到n车站,但是他要求等车的时间最短,不然间谍会被抓,有可能到不了,输出impossible. 分析: 影响每一步的决策只有两个因素,1,时刻,2,哪一个车站.那么DP状态就出来了DP[T][n]在T时刻,第n个站还要等多少分钟. 状态转

动态规划初步--城市里的间谍

一.题目 某城市的地铁是线性的,有n(2 ≤ n ≤ 50)个车站,从左到右编号为1~n.有M1辆车从第一站开始往右开,还有M2辆从第n站开始往左开.在时刻0,Mario从第一站出发,目的是在T时刻会见在n站的一个间谍.要求其在车站的等待时间足够短. 二.解题思路 状态由当前时间和当前所在站决定,我们可以用dp[i][j]表示在时刻t,第i站最少还需要等待的时间.易只T时刻的情况容易确定, dp[T][j] = (j == n ? INF : 0),而T时刻之前的dp值,可以由T时刻及其之后的决

uva1025城市里的间谍

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

北京地铁和广州地铁之感想

在北京生活了八年,前年回到广州,日常出行就靠地铁公交这些公共交通工具.对比帝都和羊城的地铁,各有各的特点.帝都地铁历史更悠久,线路更多:由于北京道路一般是横平竖直,地铁站命名更规律,十字路口的东北出入口为A,然后按顺时针分布依次为ABCD.羊城地铁最早的一号线建于九十年代,其他比起帝都地铁更新更先进,建设之初就通达机场各大火车站,更便捷.换成也比北京地铁方便,一般上下楼梯就可以换乘,不像北京地铁要绕很远才能换乘. 就日常使用来说,相对而言帝都地铁细节设计实用性更高一些,更人性化.例如:1.帝都地

画一个乘坐地铁的流程图,从购票到搭乘地铁的过程,包括安检、购票等(网易-2013)

(1)安检 作用:防止乘客携带危险物品上车,包括汽油.刀类等,保障公共安全. 需要考虑乘客分类:1)有包的乘客:需要接受安检. 2)无包的乘客:直接通行,可略过此步骤.当然,特殊时期(警备要求特别高),有时候会对每一个乘客进行身体的金属检查. (2)购票 有关购票,乘客可分为一下四种情况:1)有公交卡且卡里有足够余额的乘客(此处公交卡也包含有NFC功能的电子设备). 2)有公交卡但是卡内余额不足的乘客. 3)无公交卡的乘客,自助式机器购票(买票操作提示是否明显.容易懂). 4)无公交卡的乘客,人

个人项目-地铁出行线路规划程序

PSP表格 PSP 2.1 Personal Software Process Stages Planning Time(H) Used Time(H) Planning 计划 0.5 0.25 · Estimate · 估计这个任务需要多少时间 0.5 0.25 Development 开发 25.5 45.9 · Analysis · 需求分析 (包括学习新技术) 10 13 · Design Spec · 生成设计文档 2 3 · Design Review · 设计复审 (和同事审核设计