zoukankan      html  css  js  c++  java
  • UVA A Spy in the Metro

    点击打开题目

    题目大意:
    在一个有n个站台的地铁线路里,给你列车通向每相邻两个车站所花费的时间,从0时刻开始,从1号站出发,要在T这个时间点上,到达n号站,给你m1辆从1开到n的列车及其出发时间,和m2辆从n开到1的列车及其出发时间,求在车站停留的最短时间(注意,如果你在T之前的T’时到达n号站,那你也要花费T-T’的时间停留),如果无论如何也到不了n号站,输出“Impossible”

    设f[i][j]表示在第i时刻到达j号车站,将每辆列车到每个站的时间预处理一下,则状态转移方程为:
    f[i][j]=min(f[i][j],min(f[train1[o][j-1]][j-1]+i-train1[o][j],f[train2[o][j+1]][j+1]+i-train2[o][j]));

    代码如下:

    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<algorithm>
    using namespace std;
    int f[201][51],train1[51][51],train2[51][51],t[51];
    int T,n,m1,m2,ans;
    int getint()
    {
        int num=0,flag=1;char c;
        while((c=getchar())<'0'||c>'9')if(c=='-')flag=-1;
        while(c>='0'&&c<='9')num=num*10+c-48,c=getchar();
        return num*flag;
    }
    int main()
    {
        int i,j,o,k=0;
        while((n=getint())!=0)
        {
            ans=1<<30;
            memset(f,0x3f,sizeof f);
            T=getint();
            for(i=0;i<=T;i++)f[i][1]=i;
            for(i=1;i<n;i++)t[i]=getint();
            m1=getint();
            for(i=1;i<=m1;i++)
            {
                train1[i][1]=getint();
                for(j=1;j<n;j++)train1[i][j+1]=train1[i][j]+t[j];
            }
            m2=getint();
            for(i=1;i<=m2;i++)
            {
                train2[i][n]=getint();
                for(j=n;j>1;j--)train2[i][j-1]=train2[i][j]+t[j-1];
            }
            for(i=1;i<=T;i++)
                for(j=1;j<=n;j++)
                {
                    if(j>1)
                    {
                        for(o=1;o<=m1;o++)if(train1[o][j]<=i)
                        f[i][j]=min(f[train1[o][j-1]][j-1]+i-train1[o][j],f[i][j]);
                    }
                    if(j<n)
                    {
                        for(o=1;o<=m2;o++)if(train2[o][j]<=i)
                        f[i][j]=min(f[train2[o][j+1]][j+1]+i-train2[o][j],f[i][j]);
                    }
                }
            for(i=0;i<=T;i++)ans=min(f[i][n]+T-i,ans);
            printf("Case Number %d: ",++k);
            if(ans==0x3f3f3f3f)printf("impossible
    ");
            else printf("%d
    ",ans);
        }
    }
  • 相关阅读:
    shader变体
    正向渲染
    LWPR
    blend
    slua
    unity
    jsBridge
    浏览器
    数据运营系统
    广告
  • 原文地址:https://www.cnblogs.com/Darknesses/p/12002549.html
Copyright © 2011-2022 走看看