zoukankan      html  css  js  c++  java
  • bzoj:1221;vijos 1552 软件开发

    Description

    某软件公司正在规划一项n天的软件开发计划,根据开发计划第i天需要ni个软件开发人员,为了提高软件开发人员的效率,公司给软件人员提供了很多的服务,其中一项服务就是要为每个开发人员每天提供一块消毒毛巾,这种消毒毛巾使用一天后必须再做消毒处理后才能使用。消毒方式有两种,A种方式的消毒需要a天时间,B种方式的消毒需要b天(b>a),A种消毒方式的费用为每块毛巾fA, B种消毒方式的费用为每块毛巾fB,而买一块新毛巾的费用为f(新毛巾是已消毒的,当天可以使用);而且f>fA>fB。公司经理正在规划在这n天中,每天买多少块新毛巾、每天送多少块毛巾进行A种消毒和每天送多少块毛巾进行B种消毒。当然,公司经理希望费用最低。你的任务就是:为该软件公司计划每天买多少块毛巾、每天多少块毛巾进行A种消毒和多少毛巾进行B种消毒,使公司在这项n天的软件开发中,提供毛巾服务的总费用最低。

    Input

    第1行为n,a,b,f,fA,fB. 第2行为n1,n2,……,nn. (注:1≤f,fA,fB≤60,1≤n≤1000)

    Output

    最少费用

    Sample Input

    4 1 2 3 2 1
    8 2 1 6

    Sample Output

    38
     
    不会上下线网络流的我只能拆点……
    拆点部分贴出来咯

    for (i=1;i<=n;i++) v=read(),in(S,i,v,0),in(i+n,T,v,0),in(S,i+n,INF,f);
    for (i=1;i<n-a;i++) in(i,i+n+a+1,INF,fa);
    for (i=1;i<n-d;i++) in(i,i+n+d+1,INF,fb);//这里的d其实是原题的b
    for (i=1;i<n;i++) in(i,i+1,INF,0);

    #include<queue>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #define MAXN 2100
    #define MAXM 12000
    using namespace std;
    
    struct na{
        int y,z,f,ne;
    };
    int n,m,l[MAXN],r[MAXN],num=0,p,ch,ans=0,S,T,k,dis[MAXN],an=0,mi[MAXN],ro[MAXN],qi[MAXN],a,d,fa,fb,f,v;
    na b[MAXM];
    bool bo[MAXN];
    const int INF=1e9;
    queue <int> q;
    inline int min(int x,int y){return x>y?y:x;}
    inline int read(){
        p=0;ch=getchar();
        while (ch<'0'||ch>'9') ch=getchar();
        while (ch>='0'&&ch<='9') p=p*10+ch-48, ch=getchar();
        return p;
    }
    inline void spfa(){
        register int i;
        q.push(S);
        bo[S]=1;
        for (i=0;i<MAXN;i++) dis[i]=INF;
        mi[S]=INF;dis[S]=0;
        while(!q.empty()){
            int k=q.front();q.pop();bo[k]=0;
            if (k==T) continue;
            for (i=l[k];i;i=b[i].ne){
                if (b[i].z>0&&dis[b[i].y]>b[i].f+dis[k]){
                    dis[b[i].y]=b[i].f+dis[k];
                    mi[b[i].y]=min(mi[k],b[i].z);
                    ro[b[i].y]=i;
                    qi[b[i].y]=k;
                    if (!bo[b[i].y]){
                        bo[b[i].y]=1;
                        q.push(b[i].y);
                    }
                }
            }
        }
    }
    inline int add(int x,int y,int z,int f){
        num++;
        if (l[x]==0) l[x]=num;else b[r[x]].ne=num;
        b[num].y=y;b[num].z=z;b[num].f=f;r[x]=num;
    }
    inline void in(int x,int y,int z,int f){
        add(x,y,z,f),add(y,x,0,-f);
    }
    int main(){
        register int i,j;
        n=read();a=read();d=read();f=read();fa=read();fb=read();
        S=2*n+1;T=2*n+2;
        for (i=1;i<=n;i++) v=read(),in(S,i,v,0),in(i+n,T,v,0),in(S,i+n,INF,f);
        for (i=1;i<n-a;i++) in(i,i+n+a+1,INF,fa);
        for (i=1;i<n-d;i++) in(i,i+n+d+1,INF,fb);
        for (i=1;i<n;i++) in(i,i+1,INF,0);
        for(;;){
            spfa();
            if (dis[T]==INF) break;
            an+=mi[T]*dis[T];
            for (i=T;i;i=qi[i]) b[ro[i]].z-=mi[T],b[((ro[i]-1)^1)+1].z+=mi[T];
        }
          printf("%d
    ",an);
    }
  • 相关阅读:
    【Scheme归纳】3 比较do, let, loop
    【Scheme归纳】2 算数运算
    【Scheme归纳】1 使用Edwin
    【SICP练习】106 练习3.7
    【SICP练习】105 练习3.5-3.6
    【SICP练习】104 练习3.1-3.4
    【SICP练习】103 练习2.81-2.97
    【SICP练习】102 练习2.79-2.80
    【SICP练习】101 练习2.77-2.78
    【SICP练习】100 练习2.76
  • 原文地址:https://www.cnblogs.com/Enceladus/p/5187502.html
Copyright © 2011-2022 走看看