UVa 1025 A Spy in the Metro (DP)

题目

题目描述

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

输入输出格式

输入格式

输入文件包含数种情况,每一种情况包含以下7行:

第一行是一个正整数n,表示有n个车站 第二行是为T,表示Mario在时刻T见车站n的间谍 第三行有n-1个整数t1,t2,...,tn-1,其中ti表示地铁从车站i到i+1的行驶时间 第四行为M1,及从第一站出发向右开的列车数目 第五行包含M1个正整数a1,a2,...,aM1,即个列车出发的时间 第六行为M2,及从第一站出发向右开的列车数目 第七行包含M2个正整数b1,b2,...,bM2,即个列车出发的时间

最后一种情况以一行0结尾。

输出格式

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

输入输出样例

输入样例
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
输出样例
Case Number 1: 5
Case Number 2: 0
Case Number 3: impossible

题解

紫书经典DP, 比较基础就不说了

代码

#include<bits/stdc++.h>
const int kInfinity=0x3f3f3f3f;
using namespace std;
int n,T,M1,M2,kase;
int t[55];
bool trainl[55][10010];
bool trainr[55][10010];
int dp[10010][55];
int main(){
    while(cin>>n && n!=0){
    kase++;
    cin>>T;
    memset(t, 0, sizeof(t));
    memset(trainl, 0, sizeof(trainl));
    memset(trainr, 0, sizeof(trainr));
    for(int i=1; i<=n-1; i++) cin>>t[i];
    cin>>M1;
    for(int i=1; i<=M1; i++){
        int t1;
        cin>>t1;
        int sum=t1;
        for(int j=1; j<=n; j++){
            trainl[j][sum] = 1;
            sum+=t[j];
        }
    }
    cin>>M2;
    for(int i=1; i<=M2; i++){
        int t2;
        cin>>t2;
        int sum=t2;
        for(int j=n; j>=1; j--){
            trainr[j][sum] = 1;
            sum+=t[j-1];
        }
    }
    for(int i=1; i<=n-1; i++)
        dp[T][i]=kInfinity;
    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 && trainl[j][i] && i+t[j]<=T )
                dp[i][j] = min(dp[i][j], dp[i+t[j]][j+1]);
            if(j>1 && trainr[j][i] && i+t[j-1]<=T )
                dp[i][j] = min(dp[i][j], dp[i+t[j-1]][j-1]);
    }
    cout<< "Case Number " << kase<< ": ";
    if(dp[0][1] >= kInfinity) cout<< "impossible\n";
    else cout<<dp[0][1] <<"\n";
    }
    return 0;
}

其它

猜你喜欢

转载自www.cnblogs.com/forth/p/9696493.html
今日推荐