您的位置:首页 > 其它

UVa 1025 A Spy in the Metro

2016-06-10 18:56 375 查看

http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=35913

 

预处理出每个时间、每个车站是否有火车

为了方便判断是否可行,倒推处理,每次有三种决策:原地坐等一分钟、搭车向左(如果有车)、搭车向右(如果有车)

 

/**/
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
const int mxn=300;
int n,T;
bool h[mxn][mxn][2];
int ti[mxn];
int m,d,e;
int f[mxn][mxn];
void clear(){
memset(ti,0,sizeof(ti));
memset(h,0,sizeof(h));
memset(f,111,sizeof(f));
}
int main(){
int cnt=0;
while(scanf("%d",&n) && n){
clear();
scanf("%d",&T);
int i,j;
for(i=1;i<n;i++)scanf("%d",&ti[i]);//车站距离
scanf("%d",&m);
for(i=1;i<=m;i++)
{
scanf("%d",&d);//左边发车时间
for(j=1;d<=T && j<=n;d+=ti[j],j++){
h[d][j][0]=1;
}
}
scanf("%d",&m);
for(i=1;i<=m;i++)
{
scanf("%d",&e);//右边发车时间
for(j=n;e<=T && j>=1;j--,e+=ti[j]){
h[e][j][1]=1;
}
}
//以上全是初始化
f[T]
=0;
for(i=T-1;i>=0;i--){//倒推
for(j=1;j<=n;j++){
f[i][j]=f[i+1][j]+1;//等待
if(j<n && h[i][j][0] && i+ti[j]<=T)
f[i][j]=min(f[i][j],f[i+ti[j]][j+1]);//向右
if(j>1 && h[i][j][1] && i+ti[j-1]<=T)
f[i][j]=min(f[i][j],f[i+ti[j-1]][j-1]);//向左
}
}
printf("Case Number %d: ",++cnt);
if(f[0][1]>=0xff) printf("impossible\n");
else printf("%d\n",f[0][1]);
}
return 0;
}

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: