网络流24题-洛谷P1251 餐巾计划问题

题目描述

一个餐厅在相继的N天里,每天需用的餐巾数不尽相同。假设第i天需要\(r_i\)块餐巾( i=1,2,…,N)。餐厅可以购买新的餐巾,每块餐巾的费用为p分;或者把旧餐巾送到快洗部,洗一块需 m 天,其费用为 f 分;或者送到慢洗部,洗一块需n天(n),其费用为s分(s)。

每天结束时,餐厅必须决定将多少块脏的餐巾送到快洗部,多少块餐巾送到慢洗部,以及多少块保存起来延期送洗。但是每天洗好的餐巾和购买的新餐巾数之和,要满足当天的需求量。

试设计一个算法为餐厅合理地安排好N天中餐巾使用计划,使总的花费最小。编程找出一个最佳餐巾使用计划。

输入输出格式

输入格式:

由标准输入提供输入数据。文件第 1 行有 1 个正整数N,代表要安排餐巾使用计划的天数。

接下来的N行是餐厅在相继的N天里,每天需用的餐巾数。

最后一行包含5个正整数p,m,f,n,sp是每块新餐巾的费用; m是快洗部洗一块餐巾需用天数; f是快洗部洗一块餐巾需要的费用; n是慢洗部洗一块餐巾需用天数; s是慢洗部洗一块餐巾需要的费用。

输出格式:

将餐厅在相继的 N 天里使用餐巾的最小总花费输出

输入输出样例

输入样例#1:

输出样例#1:

说明

N<=2000

ri<=10000000

p,f,s<=10000

时限4s

提示:本题最小费用超出int范围,需要使用long long!

最小费用最大流问题。将每天的盘子分为两个集合:①第i天为止需要洗的盘子\(X_i\) ②第i天需要使用的盘子\(Y_i\)

建立超级源点\(S\),超级汇点\(T\)。首先,向\(X\)集合中的每个点连接容量为\(r_i\),费用为0的边,表示第\(i\)天为止至少会需要洗\(r_i\)个盘子,由\(Y\)集合中的每个点向\(T\)连接容量为\(r_i\),费用为0的边,表示第i天会用\(r_i\)个盘子。

我们再来考虑具体策略:

①第i天的盘子用完后,可以不送洗,积累到下一天,不用花钱。因此,由\(X_i\)向\(X_{i+1}\)连接容量为inf,费用为0的边。

②第i天的盘子用完后,送到快洗部洗,此时第i+m天需要使用的盘子可以来自于第i天,因此,由\(X_i\)向\(Y_{i+m}\)连接容量为inf,费用为f的边。

③第i天的盘子用完后,送到慢洗部洗,此时第i+n天需要使用的盘子可以来自于第i天,因此,由\(X_i\)向\(Y_{i+n}\)连接容量为inf,费用为s的边。

④第i天需要用的盘子直接来自于新购,从\(S\)向\(Y_i\)连接容量为inf,费用为p的边。

最后,跑一遍最小费用最大流,得出的最小费用就是答案(由建图方式可知最大流肯定是满足\(Y\)到\(T\)每条边满流的)。

代码:

 

stdKonjac

stdKonjac

一只挣扎的蒟蒻ACMer

评论太激烈有些评论需要亲动动手指翻页

留下你的评论

*评论支持代码高亮<pre class="prettyprint linenums">代码</pre>

*