bzoj2424 订货
Description
某公司估计市场在第i个月对某产品的需求量为Ui,已知在第i月该产品的订货单价为di,上个月月底未销完的单位产品要付存贮费用m,假定第一月月初的库存量为零,第n月月底的库存量也为零,问如何安排这n个月订购计划,才能使成本最低?每月月初订购,订购后产品立即到货,进库并供应市场,于当月被售掉则不必付存贮费。假设仓库容量为S。
Input
第1行:n, m, S (0<=n<=50, 0<=m<=10, 0<=S<=10000)
第2行:U1 , U2 , ... , Ui , ... , Un (0<=Ui<=10000)
第3行:d1 , d2 , ..., di , ... , dn (0<=di<=100)
Output
只有1行,一个整数,代表最低成本
Sample Input
3 1 1000
2 4 8
1 2 4
2 4 8
1 2 4
Sample Output
34
又一道水题
//Serene #include<algorithm> #include<iostream> #include<cstring> #include<cstdlib> #include<cstdio> #include<cmath> using namespace std; const int maxn=100+10,maxm=4*maxn+10,INF=0x3f3f3f3f; int n,m,ct,S,T; int aa;char cc; int read() { aa=0;cc=getchar(); while(cc<'0'||cc>'9') cc=getchar(); while(cc>='0'&&cc<='9') aa=aa*10+cc-'0',cc=getchar(); return aa; } struct Node{ int x,y,cap,flow,w; Node(){} Node(int x,int y,int cap,int w):x(x),y(y),cap(cap),w(w){} }node[2*maxm]; int fir[maxn],nxt[2*maxm],e=1; void add(int x,int y,int z,int w) { node[++e]=Node(x,y,z,w); nxt[e]=fir[x];fir[x]=e; node[++e]=Node(y,x,0,-w); nxt[e]=fir[y];fir[y]=e; } int zz[maxn],dis[maxn],from[maxn]; bool vis[maxn]; bool spfa() { int s=1,t=0,x,y,z; memset(dis,0x3f3f3f3f,sizeof(dis)); dis[S]=0; zz[++t]=S; vis[S]=1; while(s<=t) { x=zz[s%maxn]; for(y=fir[x];y;y=nxt[y]) { z=node[y].y; if(dis[z]<=dis[x]+node[y].w||node[y].flow>=node[y].cap) continue; if(!vis[z]) { vis[z]=1; t++;// zz[t%maxn]=z; } from[z]=y; dis[z]=dis[x]+node[y].w; } s++; vis[x]=0; } return dis[T]!=INF; } int MCMF() { int rs=0,now; while(spfa()) { now=INF; for(int i=T;i!=S;i=node[from[i]].x) now=min(now,node[from[i]].cap-node[from[i]].flow); for(int i=T;i!=S;i=node[from[i]].x) { node[from[i]].flow+=now; node[from[i]^1].flow-=now; rs+=now*node[from[i]].w; } } return rs; } int main() { n=read();m=read();ct=read(); int x,y; S=n+1;T=S+1; for(int i=1;i<=n;++i) { x=read(); add(i,T,x,0); } for(int i=1;i<=n;++i) { x=read(); add(S,i,INF,x); } for(int i=1;i<n;++i) add(i,i+1,ct,m); printf("%d",MCMF()); return 0; }
弱者就是会被欺负呀