uva 1025 A Spy int the Metro

时间:2024-04-24 15:46:13

https://vjudge.net/problem/UVA-1025

看见spy忍俊不禁的想起省赛时不知道spy啥意思 ( >_<

f[i][j]表示i时刻处于j站所需的最少等待时间,有三种可能,一是i-1时刻就在这里然后等待了1时刻  f[i][j]=f[i-1][j]+1  ; 二是正好由由左边相邻的一个车站开过来(如果可以的话)  f[i][j]=f[i-t[j-1]][j-1];  三是正好由右边的车站开过来(if can) f[i][j]=f[i-t[j]][j+1]; 取三者的最小值就好,最后如果f[T][N]>=inf表示impossible.

 #include<bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
int t[],tl[],tr[];
int f[][];
bool can[][][];
int main()
{
int N,T,M1,M2,i,j,k=;
while(cin>>N&&N){
cin>>T;
for(i=;i<N;++i) scanf("%d",t+i);
memset(f,inf,sizeof(f));
memset(can,,sizeof(can));
cin>>M1;
for(i=;i<=M1;++i)
{
int s;
scanf("%d",tl+i);
for(j=,s=tl[i];j<=N&&s<=T;s+=t[j++])
{
can[s][j][]=;
}
}
cin>>M2;
for(i=;i<=M2;++i)
{
int s;
scanf("%d",tr+i);
for(j=N,s=tr[i];j>=&&s<=T;s+=t[j-],j--)
can[s][j][]=;
}
f[][]=;
for(i=;i<=T;++i)
{
for(j=;j<=N;++j)
{
f[i][j]=f[i-][j]+;
if(j>&&i-t[j-]>=&&can[i-t[j-]][j-][])
f[i][j]=min(f[i][j],f[i-t[j-]][j-]);
if(j<N&&i-t[j]>=&&can[i-t[j]][j+][])
f[i][j]=min(f[i][j],f[i-t[j]][j+]);
}
}
printf("Case Number %d: ",++k);
if(f[T][N]>=inf) puts("impossible");
else cout<<f[T][N]<<endl;
}
return ;
}
/*
4
55
5 10 15
4
0 5 10 20
4
0 5 10 15 ans=5
*/