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

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

本题地址:http://www.luogu.org/problem/show?pid=2583

题目描述

  特工玛利亚被送到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分钟。

【思路】

DP(时间空间)。

时间是一个天然的序 =-=,我们设d[i][j]表示时刻i位于车站j所需要等车的最少时间,则有转移式:

    d[i][j]=min{ d[i][j+1]+1,d[i+t[j]][j+1],d[i+t[j-1]][j-1]  }

根据输入的火车构造hasedge[i][j][k]表示时刻i位于车站j有没有向k走的火车。

【代码】

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 using namespace std;
 5
 6 const int maxn = 500+10;
 7 const int INF=1e9;
 8
 9 int d[maxn][maxn],t[maxn];
10 bool hasedge[maxn][maxn][2];
11 int n,m1,m2,T;
12
13 int dp(int i,int j)
14 {
15     int& ans=d[i][j];
16     if(ans) return ans;
17     if(i==T && j==n) return 0;
18     if((i>T) || (i==T&&j!=n)) return INF;
19
20     ans=INF;
21     ans=min(ans,dp(i+1,j)+1);
22     if(hasedge[i][j][0] && j<n) ans=min(ans,dp(i+t[j],j+1));
23     if(hasedge[i][j][1] && j>1) ans=min(ans,dp(i+t[j-1],j-1));
24     return ans;
25 }
26
27 int main() {
28     int kase=0;
29     while(scanf("%d",&n)==1 && n) {
30         memset(d,0,sizeof(d));
31         memset(hasedge,0,sizeof(hasedge));
32
33         scanf("%d",&T);
34         for(int i=1;i<n;i++) scanf("%d",&t[i]);
35         scanf("%d",&m1);
36         int st;
37         for(int i=1;i<=m1;i++) {
38             scanf("%d",&st);
39             if(st>T) continue;
40             for(int j=1;j<=n;j++) {
41                 hasedge[st][j][0]=1;
42                 st += t[j];
43             }
44         }
45         scanf("%d",&m2);
46         for(int i=1;i<=m2;i++) {
47             scanf("%d",&st);
48             if(st>T) continue;
49             for(int j=n;j;j--) {
50                 hasedge[st][j][1]=1;
51                 st += t[j-1];
52             }
53         }
54         int ans=dp(0,1);
55         printf("Case Number %d: ",++kase);
56         if(ans==INF) printf("impossible\n"); else printf("%d\n",ans);
57     }
58     return 0;
59 }
时间: 2025-01-04 16:42:17

洛谷2583 地铁间谍 (UVa1025A Spy in the Metro)的相关文章

地铁间谍(洛谷 2583)

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

洛谷P1710地铁涨价

题目背景 本题开O2优化,请注意常数 题目描述 博艾市除了有海底高铁连接中国大陆.台湾与日本,市区里也有很成熟的轨道交通系统.我们可以认为博艾地铁系统是一个无向连通图.博艾有N个地铁站,同时有M小段地铁连接两个不同的站. 地铁计价方式很简单.从A站到B站,每经过一小段铁路(连接直接相邻的两个点的一条边),就要收取1博艾元.也就是说,从A站到B站,选择的路径不一样,要价也会不同. 我们认为凡华中学在1号地铁站.学生们通过地铁通勤,他们当然知道选择最短路来坐车的话,票价最便宜. 然而博艾地铁公司经营

洛谷 P1710 地铁涨价

题目背景 本题开O2优化,请注意常数 题目描述 博艾市除了有海底高铁连接中国大陆.台湾与日本,市区里也有很成熟的轨道交通系统.我们可以认为博艾地铁系统是一个无向连通图.博艾有N个地铁站,同时有M小段地铁连接两个不同的站. 地铁计价方式很简单.从A站到B站,每经过一小段铁路(连接直接相邻的两个点的一条边),就要收取1博艾元.也就是说,从A站到B站,选择的路径不一样,要价也会不同. 我们认为凡华中学在1号地铁站.学生们通过地铁通勤,他们当然知道选择最短路来坐车的话,票价最便宜. 然而博艾地铁公司经营

【洛谷1262】间谍网络

tarjan缩点后找入度为零的强连通分量,加上它的sum即可 但注意到还有NO的可能, 所以大致有两种方法: 1.tarjan之前先来一遍bfs 2.tarjan内加一个数组维护最小编号 貌似前者比较好写qwq 1 #include<cstdio> 2 #include<cstring> 3 using namespace std; 4 const int N=3010,M=6020; 5 const int novis=-1,nowvis=1,over=0; 6 int valu

UVA1025---A Spy in the Metro(DP)

http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=35913 Secret agent Maria was sent to Algorithms City to carry out an especially dangerous mission. Afterseveral thrilling events we ?nd her in the ?rst station of Algorithms City Metro, exam

UVA1025---A Spy in the Metro(简单dp)

dp[i][j]表示时刻i,在车站j,等待的最少时间 有3种方案: 等一分钟 往左搭车 往右搭车 /************************************************************************* > File Name: uva1025.cpp > Author: ALex > Mail: [email protected] > Created Time: 2015年05月25日 星期一 19时05分09秒 ***********

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

#include<iostream> #include<cstdio> #include<memory.h> using namespace std; #define min(a,b) (a)<(b)?(a):(b) #define INF 0x3f3f3f3f #define N 55 #define M 220 int k,n,T,M1,M2,a,b; int t[N]; int f[M][N]; bool trn[M][N][2]; int main(){

洛谷P1726 上白泽慧音

P1726 上白泽慧音 124通过 343提交 题目提供者yeszy 标签图论 难度提高+/省选- 提交该题 讨论 题解 记录 最新讨论 给两组数据吧! 题目描述 在幻想乡,上白泽慧音是以知识渊博闻名的老师.春雪异变导致人间之里的很多道路都被大雪堵塞,使有的学生不能顺利地到达慧音所在的村庄.因此慧音决定换一个能够聚集最多人数的村庄作为新的教学地点.人间之里由N个村庄(编号为1..N)和M条道路组成,道路分为两种一种为单向通行的,一种为双向通行的,分别用1和2来标记.如果存在由村庄A到达村庄B的通

洛谷 P2709 BZOJ 3781 小B的询问

题目描述 小B有一个序列,包含N个1~K之间的整数.他一共有M个询问,每个询问给定一个区间[L..R],求Sigma(c(i)^2)的值,其中i的值从1到K,其中c(i)表示数字i在[L..R]中的重复次数.小B请你帮助他回答询问. 输入输出格式 输入格式: 第一行,三个整数N.M.K. 第二行,N个整数,表示小B的序列. 接下来的M行,每行两个整数L.R. 输出格式: M行,每行一个整数,其中第i行的整数表示第i个询问的答案. 输入输出样例 输入样例#1: 6 4 3 1 3 2 1 1 3