BZOJ1221 HNOI2001 軟體開發

2022-05-03 23:36:13 字數 2057 閱讀 2702

某軟體公司正在規劃一項n天的軟體開發計畫,根據開發計畫第i天需要ni個軟體開發人員,為了提高軟體開發人員的效率,公司給軟體人員提供了很多的服務,其中一項服務就是要為每個開發人員每天提供一塊消毒毛巾,這種消毒毛巾使用一天後必須再做消毒處理後才能使用。消毒方式有兩種,a種方式的消毒需要a天時間,b種方式的消毒需要b天(b>a),a種消毒方式的費用為每塊毛巾fa, b種消毒方式的費用為每塊毛巾fb,而買一塊新毛巾的費用為f(新毛巾是已消毒的,當天可以使用);而且f>fa>fb。公司經理正在規劃在這n天中,每天買多少塊新毛巾、每天送多少塊毛巾進行a種消毒和每天送多少塊毛巾進行b種消毒。當然,公司經理希望費用最低。你的任務就是:為該軟體公司計畫每天買多少塊毛巾、每天多少塊毛巾進行a種消毒和多少毛巾進行b種消毒,使公司在這項n天的軟體開發中,提供毛巾服務的總費用最低。

第1行為n,a,b,f,fa,fb. 第2行為n1,n2,……,nn. (注:1≤f,fa,fb≤60,1≤n≤1000)

最少費用

4 1 2 3 2 1

8 2 1 6

38 最小費用最大流

將每天拆成2個點i、i`,之間連一條容量為n[i]的邊,為了保證這些邊必須加滿,可以將這些邊的費用減去乙個合適的值。

s向左邊的點連容量為inf,費用為f的邊。右邊的點向t連容量為inf,費用為0的邊。

右邊的點i`向i+a-1連一條容量為inf,權值為fa的邊;向i+b-1連一條容量為inf,費用為fb的邊。

因為消毒後的毛巾不一定馬上要用,將i向i+1連一條容量為inf,費用為0的邊。

算一下不固定容量的費用流,最後再把權值加回去就行了。

#include#include

#include

#include

#include

#include

#define rep(i,s,t) for(int i=s;i<=t;i++)

#define dwn(i,s,t) for(int i=s;i>=t;i--)

#define ren for(int i=first[x];i!=-1;i=next[i])

using

namespace

std;

inline

intread()

typedef

long

long

ll;const

int inf=1e9;

const

int maxn=2010

;const

int maxm=40010

;struct

zkw edges[maxm];

ll cost,ans,d[maxn];

void init(int

n)

void addedge(int u,int v,int w,int

cost) ;next[m]=first[u];first[u]=m++;

edges[m]=(edge);next[m]=first[v];first[v]=m++;

}int vis[maxn];dequeq;

intbfs() }}

}rep(i,

0,m-1) edges[i].cost+=d[edges[i].to]-d[edges[i].from

]; cost+=d[s];return d[s]!=inf&&cost<0

; }

int dfs(int x,int

a)

int f,flow=0;vis[x]=1

; ren

}return

flow;

}ll solve(

int s,int

t) while

(tmp);

return

ans;

}}sol;

intmain()

printf(

"%lld\n

",sol.solve(s,t)+(ll)tot*1000000

);

return0;

}

view code

bzoj1221 HNOI2001 軟體開發

time limit 10 sec memory limit 162 mb submit 1351 solved 748 submit status discuss 某軟體公司正在規劃一項n天的軟體開發計畫,根據開發計畫第i天需要ni個軟體開發人員,為了提高軟體開發人員的效率,公司給軟體人員提供了很...

狡猾的商人 bzoj1202,HNOI2005

ac通道 分析 因為每月的總收入可以為正,也可以為負,所以要比較兩個區間是否相符,當且僅當它們邊界都相同時才能比較。我們設w i 表示第1 i個月的總收入與第1 fa i 1 個月的總收入之差,及第fa i i個月的總收入。如圖。若i 1,j在同乙個集合中,則第i j個月的總收入為w j w i 1...

1221 HNOI2001 軟體開發

最小費用最大流。建圖 拆點,每個點拆成入點和出點。顯然,要滿足每天的餐巾 於是有附加源匯st,s向入點引一條容量為ni,費用為0的邊,出點向t引一條容量為ni,費用為0的邊。若滿足題目要求,這必有所有出點到t的弧滿載,為了保證這一點,由s向出點引容量為無窮,費用為f的邊。又因為每天沒用完的餐巾可以留...