[HNOI2001][BZOJ1221] 軟體開發

來源:互聯網
上載者:User

標籤:

1221: [HNOI2001] 軟體開發Time Limit: 10 Sec  Memory Limit: 162 MB
Submit: 868  Solved: 482
[Submit][Status][Discuss]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 Input4 1 2 3 2 1
8 2 1 6
Sample Output 38
HINT Source

最小費用最大流

 首先無視費用,要求的就是每天的需求都要滿足。而每天的毛巾都有這幾個來源:昨天沒洗,買了條新的,a天前消毒的,b天前消毒的。所以構造二分圖:左邊是今天用完的,右面是今天需要的。然後連邊跑費用流就好了。
#include<iostream>#include<cstdio>#include<cstdlib>#include<cstring>#include<cmath>#include<algorithm>#include<vector>#include<queue>#include<map>#include<set>#define INF 100000007#define MAX 2000002#define MAXN 2005#define MOD 2002using namespace std;int next[MAX],list[MAX],from[MAX],flow[MAX],cost[MAX];int head[MAXN],dis[MAXN],q[MAXN],path[MAXN];int n,m,a,b,fa,fb,f,ans,cnt;bool v[MAXN];void insert(int x,int y,int w,int z){    next[++cnt]=head[x];    head[x]=cnt;    from[cnt]=x;    list[cnt]=y;    flow[cnt]=w;    cost[cnt]=z;}bool spfa(){    memset(v,0,sizeof(v));    for (int i=0;i<=2*n+1;i++) dis[i]=INF;    dis[0]=1; v[0]=1; q[1]=0;    int t=0,w=1,x;    while (t!=w)    {        t=(t+1)%MOD;        x=q[t];        for (int i=head[x];i;i=next[i])            if (flow[i]&&dis[x]+cost[i]<dis[list[i]])            {                dis[list[i]]=dis[x]+cost[i];                path[list[i]]=i;                if (!v[list[i]])                {                    v[list[i]]=1;                    w=(w+1)%MOD;                    q[w]=list[i];                }            }        v[x]=0;    }    return dis[2*n+1]!=INF;}void mcf(){    int x=INF,i;    i=path[2*n+1];    while (i)    {        x=min(x,flow[i]);        i=path[from[i]];    }    i=path[2*n+1];    while (i)    {        ans+=cost[i]*x;        flow[i]-=x;        flow[i^1]+=x;        i=path[from[i]];    }}int main(){    scanf("%d%d%d%d%d%d",&n,&a,&b,&f,&fa,&fb);    cnt=1;    for (int i=1;i<=n;i++)     {        scanf("%d",&m);        insert(0,i,m,0);        insert(i,0,0,0);        insert(i+n,2*n+1,m,0);        insert(2*n+1,i+n,0,0);        insert(0,n+i,INF,f);        insert(n+i,0,0,-f);    }    for (int i=1;i<=n;i++)     {        if (i+1<=n)        {            insert(i,i+1,INF,0);            insert(i+1,i,0,0);        }        if (i+a+1<=n)         {            insert(i,n+i+a+1,INF,fa);            insert(n+i+a+1,i,0,-fa);        }        if (i+b+1<=n)        {            insert(i,n+i+b+1,INF,fb);            insert(n+i+b+1,i,0,-fb);        }    }    ans=0;    while (spfa()) mcf();    printf("%d",ans);    return 0;}

 

[HNOI2001][BZOJ1221] 軟體開發

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.