/************************************************************************/
/* 某城市地铁是线性的,有n个车站,从左到右编号1-n。有M1辆列车从第1站开始往右开
,还有M2辆列车从第n站开始往左开。在时刻0,Mario从第1站出发,目的在时刻T会见车站n的一个间谍。
在车站等车时容易被抓,所以她决定尽量躲在开动的火车上,让在车站等待的时间尽量短。列车靠站停车时间忽略不计,
且Mario身手敏捷,即时两辆方向不同的列车在同一时间靠站,Mario也能完成换乘 */
/************************************************************************/
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
const int inf = 0x3f3f3f3f;
bool hasTrain[250][250][2];
int dp[250][250];
int t[75];
int main()
{
int n;
cin >> n;
int T;
cin >> T;
for( int i = 1 ; i < n ; i ++ ){
cin >> t[i];
}
//M1辆列出向右
int M1;
cin >> M1;
int startTime;
//输入每辆列车的起始时间和 在每一站的时间
for( int i = 0 ; i < M1 ; i ++ ){
cin >> startTime;
for( int j = 1 ; startTime <= T && j < n ; j ++ ){
hasTrain[startTime][j][0] = true;
startTime += t[j];
}
}
//M1辆列出向左
int M2;
cin >> M2;
//输入每辆列车的起始时间和 在每一站的时间
for( int i = 0 ; i < M2 ; i ++ ){
cin >> startTime;
for( int j = n ; startTime <= T && j >= 1 ; j -- ){
hasTrain[startTime][j][1] = true;
startTime += t[j-1];
}
}
for( int i = 1 ; i <= n-1 ; i ++ )
dp[T][i] = inf;
//在T时刻到车站n是最终状态 时间为0
dp[T][n] = 0;
//3种决策:
//在T的前一时刻逆推
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 && hasTrain[i][j][0] && i+t[j] <= T )
dp[i][j] = min(dp[i][j],dp[i+t[j]][j+1]);
//向左
if( j < n && hasTrain[i][j][1] && i+t[j-1] <= T )
dp[i][j] = min(dp[i][j],dp[i+t[j-1]][j-1]);
}
}
if( dp[0][1] >= inf )
cout << "impossible" << endl;
else
cout << dp[0][1] << endl;
return 0;
}
UVa城市里的间谍
最新推荐文章于 2019-06-01 23:41:36 发布
2418

被折叠的 条评论
为什么被折叠?



