UVA - 1025

时间:2019-10-26
本文章向大家介绍UVA - 1025,主要包括UVA - 1025使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

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

#include<iostream>
#include<cstdio>
#include<algorithm>

#define ri register int
#define u int

namespace opt {

    inline u in() {
        u x(0),f(1);
        char s=getchar();
        while(s<'0'||s>'9') {
            if(s=='-') f=-1;
            s=getchar();
        }
        while(s>='0'&&s<='9') {
            x=(x<<1)+(x<<3)+s-'0';
            s=getchar();
        }
        return x*f;
    }

}

using opt::in;

#define NN 55

#include<cstring>

namespace mainstay {

    u N,T,m1,m2,s[NN];

    u can[NN][205][2],f[205][NN];

    inline void solve() {
        for(ri cas(1);; ++cas) {
            std::memset(can,0,sizeof(can));
            std::memset(s,0,sizeof(s));
            if(!(N=in())) return;T=in();
            for(ri i(2); i<=N; ++i) s[i]=s[i-1]+in();
            m1=in();
            for(ri k(1); k<=m1; ++k) {
                u _a(in());
                for(ri i(1); i<=N; ++i) {
                    if(_a+s[i]<=T)
                    can[i][_a+s[i]][1]=1;
                }
            }
            m2=in();
            for(ri k(1); k<=m2; ++k) {
                u _a(in());
                for(ri i(1); i<=N; ++i) {
                    if(_a+s[N]-s[i]<=T)
                    can[i][_a+s[N]-s[i]][0]=1;
                }
            }
            std::memset(f,0x3f,sizeof(f));
            f[0][1]=0;
            for(ri t(1); t<=T; ++t) {
                for(ri x(1); x<=N; ++x) {
                    f[t][x]=f[t-1][x]+1;
                    if(x^1&&can[x][t][1]&&t-(s[x]-s[x-1])>=0){
                        f[t][x]=std::min(f[t][x],f[t-(s[x]-s[x-1])][x-1]);
                    }
                    if(x^N&&can[x][t][0]&&t-(s[x+1]-s[x])>=0){
                        f[t][x]=std::min(f[t][x],f[t-(s[x+1]-s[x])][x+1]);
                    }
                }
            }
            if(f[T][N]<0x3f3f3f3f) printf("Case Number %d: %d\n",cas,f[T][N]);
            else printf("Case Number %d: impossible\n",cas);
        }
    }

}

int main() {

    //freopen("subway.in","r",stdin);
    //freopen("subway.out","w",stdout);
    mainstay::solve();

}

原文地址:https://www.cnblogs.com/ling-zhi/p/11743222.html