地铁间谍(洛谷 2583)

Posted Cola

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了地铁间谍(洛谷 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
/*
  思路是好想,设f[i][j]为前i分钟走到j站的最少等待时间,a[i][j][0/1]代表第i分钟有无从前或从后来的车,
  自己写的转移方程感觉很有道理,交上去一个点也过不了,然后看看题解,和自己的差不多,可能有些细节没处理好吧。 
*/
#include<cstdio>
#include<algorithm>
#include<cstring>
#define M 1005
#define inf 0x3f3f3f3f
using namespace std;
int n,T,m,w[M],f[M][M],a[M][M][2];
void init()
{
    int i,j,start;
    memset(f,0x3f3f3f3f,sizeof(f));
    memset(a,0,sizeof(a));
    scanf("%d",&T);
    for(i=1;i<n;i++)
      scanf("%d",&w[i]);
    scanf("%d",&m);
    for(i=1;i<=m;i++)
    {
        scanf("%d",&start);
        a[start][1][0]=1;
        for(j=2;j<=n;j++)
        {
            start+=w[j-1];
            a[start][j][0]=1;
        }
    }
    scanf("%d",&m);
    for(i=1;i<=m;i++)
    {
        scanf("%d",&start);
        a[start][n][1]=1;
        for(j=n-1;j>=1;j--)
        {
            start+=w[j];
            a[start][j][1]=1;
        }
    }
    return;
}
void work()
{
    int i,j;
    f[0][1]=0;
    for(i=1;i<=T;i++)
    {
        for(j=1;j<=n;j++)
        {
            f[i][j]=f[i-1][j]+1;
            if(j>=2&&i-w[j-1]>=0&&a[i-w[j-1]][j-1][0])
              f[i][j]=min(f[i][j],f[i-w[j-1]][j-1]);
            if(j<n&&i-w[j]>=0&&a[i-w[j]][j+1][1])
              f[i][j]=min(f[i][j],f[i-w[j]][j+1]);
        }
    }
    return ;
}
int main()
{
    int kase=0;
    while(scanf("%d",&n)==1&&n!=0)
    {
        init();
        work();
        printf("Case Number %d: ",++kase);
        if(f[T][n]<inf) printf("%d\\n",f[T][n]);
        else printf("impossible\\n");
    }
    return 0;
}
View Code

 

以上是关于地铁间谍(洛谷 2583)的主要内容,如果未能解决你的问题,请参考以下文章

洛谷——P1262 间谍网络

洛谷P1262 间谍网络

洛谷 P1262 间谍网络

洛谷 P1262 间谍网络==Codevs 4093 EZ的间谍网络

洛谷 P1262 间谍网络

tarjan缩点以及链式前向星的基本+应用(洛谷1262 间谍网络)