A spy in the Metro

多组数据

输入n,一直线地铁线上有n个车站。

输入T,表示间谍要在时间T在车站n与人会面

输入ti,表示i到i+1站地铁所花费的时间。

输入m1表示从1向n开的车的数量。

输入di 表示第i辆车的出发时间。

输入m2表示从n向1开的车的数量。

输入ei 表示第i辆车的出发时间。

间谍0时刻时在第一站,输出最少在车外等待时间,若不能到n输出impossible。(尽量使间谍乘车)

f[i][j]表示时间i时,间谍在j车站未来最少等车时间。

在车站等候f[i+1][j]+1

坐车向左f[i+tj][j+1]

坐车向右f[i+t(j-1)][j-1]

三者取最小即可,还要做时间i时有无在车站j向左向右的预处理。

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int M=1e9;
int f[205][55],ti[55];
bool sf[205][55][2];
int main()
{
    int n,cas=0;
    while(scanf("%d",&n)&&n)
    {
        memset(sf,0,sizeof(sf));
        int t,m;
        scanf("%d",&t);
        for(int i=1;i<n;++i) scanf("%d",&ti[i]);
        scanf("%d",&m);
        for(int i=1;i<=m;++i) 
        {
            int tt;
            scanf("%d",&tt);
            for(int j=1;tt<=t&&j<=n;++j)
                sf[tt][j][0]=1,tt+=ti[j];
        }
        scanf("%d",&m);
        for(int i=1;i<=m;++i)
        {
            int tt;
            scanf("%d",&tt);
            for(int j=n;tt<=t&&j;--j)
                sf[tt][j][1]=1,tt+=ti[j-1];
        }
        for(int i=1;i<n;++i) f[t][i]=M;
        f[t][n]=0;
        for(int i=t-1;i>=0;--i)
            for(int j=1;j<=n;++j)
            {
                f[i][j]=f[i+1][j]+1;
                if(j!=n&&sf[i][j][0]&&i+ti[j]<=t) f[i][j]=min(f[i][j],f[i+ti[j]][j+1]);
                if(j!=1&&sf[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: ",++cas);
        if(f[0][1]>=M) printf("impossible\n");
        else printf("%d\n",f[0][1]);
    }
    return 0;
}