標籤:des style blog http color 使用 os io
1221: [HNOI2001] 軟體開發Time Limit: 10 Sec Memory Limit: 162 MB
Submit: 503 Solved: 265
[Submit][Status]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
最小費用最大流
題解:我想說這題與餐巾計劃有區別嗎?。。。題目坑爹,也沒說可以留到下一天洗,害我WA一次代碼:
1 const inf=maxlongint; 2 type node=record 3 from,go,next,v,c:longint; 4 end; 5 var e:array[0..2000000] of node; 6 pre,head,q,d:array[0..1000000] of longint; 7 v:array[0..1000000] of boolean; 8 i,j,n,m,maxf,s,t,l,r,mincost,tot,a,b,fa,fb,f,x:longint; 9 function min(x,y:longint):longint; 10 begin 11 if x<y then exit(x) else exit(y); 12 end; 13 procedure ins(x,y,z,w:longint); 14 begin 15 inc(tot); 16 with e[tot] do 17 begin 18 from:=x;go:=y;v:=z;c:=w;next:=head[x];head[x]:=tot; 19 end; 20 end; 21 procedure insert(x,y,z,w:longint); 22 begin 23 ins(x,y,z,w);ins(y,x,0,-w); 24 end; 25 function spfa:boolean; 26 var i,x,y:longint; 27 begin 28 fillchar(v,sizeof(v),false); 29 for i:=s to t do d[i]:=inf; 30 l:=0;r:=1;q[1]:=s;d[s]:=0;v[s]:=true; 31 while l<r do 32 begin 33 inc(l); 34 x:=q[l];v[x]:=false; 35 i:=head[x]; 36 while i<>0 do 37 begin 38 y:=e[i].go; 39 if (e[i].v<>0) and (d[x]+e[i].c<d[y]) then 40 begin 41 d[y]:=d[x]+e[i].c; 42 pre[y]:=i; 43 if not(v[y]) then 44 begin 45 v[y]:=true; 46 inc(r); 47 q[r]:=y; 48 end; 49 end; 50 i:=e[i].next; 51 end; 52 end; 53 exit(d[t]<>inf); 54 end; 55 procedure mcf; 56 var i,tmp:longint; 57 begin 58 mincost:=0; 59 while spfa do 60 begin 61 tmp:=inf; 62 i:=pre[t]; 63 while i<>0 do 64 begin 65 tmp:=min(tmp,e[i].v); 66 i:=pre[e[i].from]; 67 end; 68 inc(mincost,tmp*d[t]); 69 i:=pre[t]; 70 while i<>0 do 71 begin 72 dec(e[i].v,tmp); 73 inc(e[i xor 1].v,tmp); 74 i:=pre[e[i].from]; 75 end; 76 end; 77 end; 78 procedure init; 79 begin 80 tot:=1; 81 readln(n,a,b,f,fa,fb); 82 s:=0;t:=2*n+1; 83 for i:=1 to n do 84 begin 85 read(x); 86 insert(i+n,t,x,0); 87 insert(s,i,x,0); 88 insert(s,i+n,x,f); 89 if i+1<=n then insert(i,i+1,inf,0); 90 if i+a+1<=n then insert(i,i+a+n+1,inf,fa); 91 if i+b+1<=n then insert(i,i+b+n+1,inf,fb); 92 end; 93 94 end; 95 procedure main; 96 begin 97 mincost:=0; 98 mcf; 99 writeln(mincost);100 end;101 begin102 assign(input,‘input.txt‘);assign(output,‘output.txt‘);103 reset(input);rewrite(output);104 init;105 main;106 close(input);close(output);107 end.
View Code