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
8 2 1 6
Sample Output
38
上个题做了一个餐巾计划的弱化版……这个题直接就是餐巾计划(近乎原题了)
只不过餐巾计划餐巾洗完了当天就能用,这个要往后延一天
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<queue>
#define LL long long
#define MAXN (10000+10)
#define MAXM (2000000+10)
using namespace std;
queue<LL>q;
LL n,m,k,s=,e=,Ans,Fee;
LL num_edge,head[MAXN],dis[MAXN];
LL Need[MAXN],pre[MAXN],INF;
bool used[MAXN];
struct node
{
LL to,next,Flow,Cost;
} edge[MAXM*]; void add(LL u,LL v,LL l,LL c)
{
edge[++num_edge].to=v;
edge[num_edge].next=head[u];
edge[num_edge].Flow=l;
edge[num_edge].Cost=c;
head[u]=num_edge;
} bool Spfa(LL s,LL e)
{
memset(pre,-,sizeof(pre));
memset(dis,0x7f,sizeof(dis));
q.push(s);
dis[s]=;
used[s]=true;
while (!q.empty())
{
LL x=q.front();
q.pop();
for (int i=head[x]; i!=; i=edge[i].next)
if (edge[i].Flow> && dis[x]+edge[i].Cost<dis[edge[i].to])
{
dis[edge[i].to]=dis[x]+edge[i].Cost;
pre[edge[i].to]=i;
if (!used[edge[i].to])
{
used[edge[i].to]=true;
q.push(edge[i].to);
}
}
used[x]=false;
}
return (dis[e]!=INF);
} void MCMF(LL s,LL e)
{
LL Ans=,Fee=;
while (Spfa(s,e))
{
LL d=INF;
for (int i=e; i!=s; i=edge[((pre[i]-)^)+].to)
d=min(d,edge[pre[i]].Flow);
for (int i=e; i!=s; i=edge[((pre[i]-)^)+].to)
{
edge[pre[i]].Flow-=d;
edge[((pre[i]-)^)+].Flow+=d;
}
Ans+=d;
Fee+=d*dis[e];
}
printf("%lld",Fee);
} int main()
{
memset(&INF,0x7f,sizeof(INF));
scanf("%lld",&n);
LL New,FD,FC,SD,SC;
scanf("%lld%lld%lld%lld%lld",&FD,&SD,&New,&FC,&SC);
for (LL i=; i<=n; ++i)
{
scanf("%lld",&Need[i]);
add(s,(i-)*+,Need[i],);
add((i-)*+,s,,);
add((i-)*+,e,Need[i],);
add(e,(i-)*+,,);
if (i<n)
{
add((i-)*+,i*+,INF,);
add(i*+,(i-)*+,,);
}
}
for (int i=; i<=n; ++i)
{
add(s,(i-)*+,INF,New);
add((i-)*+,s,,-New); add((i-)*+,(i+FD)*+,INF,FC);
add((i+FD)*+,(i-)*+,,-FC); add((i-)*+,(i+SD)*+,INF,SC);
add((i+SD)*+,(i-)*+,,-SC); }
MCMF(s,e);
}