LOJ #6008. 「网络流 24 题」餐巾计划

#6008. 「网络流 24 题」餐巾计划

题目描述

一个餐厅在相继的 n nn 天里,每天需用的餐巾数不尽相同。假设第 i ii 天需要 ri r_ir?i?? 块餐巾。餐厅可以购买新的餐巾,每块餐巾的费用为 P PP 分;或者把旧餐巾送到快洗部,洗一块需 M MM天,其费用为 F FF 分;或者送到慢洗部,洗一块需 N NN 天,其费用为 S SS 分(S<F S < FS<F)。

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

试设计一个算法为餐厅合理地安排好 n nn 天中餐巾使用计划,使总的花费最小。

输入格式

第 1 11 行有 6 66 个正整数 n nn、P PP、M MM、F FF、N NN、S SS。

n nn 是要安排餐巾使用计划的天数,P PP 是每块新餐巾的费用,M MM 是快洗部洗一块餐巾需用天数,F FF 是快洗部洗一块餐巾需要的费用,N NN 是慢洗部洗一块餐巾需用天数,S SS 是慢洗部洗一块餐巾需要的费用。

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

输出格式

输出餐厅在相继的 n nn 天里使用餐巾的最小总花费。

样例

样例输入

3 10 2 3 3 2
5
6
7

样例输出

145

数据范围与提示

1≤n≤1000 1 \leq n \leq 10001≤n≤1000

code

 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<cstring>
 4
 5 using namespace std;
 6 const int N = 5010;
 7 const int INF = 1e9;
 8
 9 struct Edge{
10     int u,v,f,c,nxt;
11     Edge(){}
12     Edge(int a,int b,int flow,int cost,int nt) { //-
13         u = a;v = b;f = flow;c = cost;nxt = nt;
14     }
15 }e[100100];
16 int head[N],dis[N],q[100100],pre[N];
17 bool vis[N];
18 int L,R,S,T,tot = 1,Mc,Mf;
19
20 inline char nc() {
21     static char buf[10010],*p1 = buf,*p2 = buf;
22     return p1==p2&&(p2=(p1=buf)+fread(buf,1,10000,stdin),p1==p2)?EOF:*p1++;
23 }
24 int read() {
25     int x = 0,f = 1;char ch = nc();
26     for (; ch<‘0‘||ch>‘9‘; ch=nc()) if (ch==‘-‘)f=-1;
27     for (; ch>=‘0‘&&ch<=‘9‘; ch=nc()) x=x*10+ch-‘0‘;
28     return x*f;
29 }
30 void add_edge(int u,int v,int f,int c) {
31     e[++tot] = Edge(u,v,f,c,head[u]);head[u] = tot;
32     e[++tot] = Edge(v,u,0,-c,head[v]);head[v] = tot;
33 }
34 bool spfa() {
35     for (int i=1; i<=T; ++i) vis[i]=false,dis[i]=INF;
36     L = 1;R = 0;
37     dis[S] = 0;
38     q[++R] = S;vis[S] = true;pre[S] = 0;
39     while (L <= R) {
40         int u = q[L++];
41         for (int i=head[u]; i; i=e[i].nxt) {
42             int v = e[i].v;
43             if (dis[v]>dis[u]+e[i].c && e[i].f > 0) {
44                 dis[v] = dis[u] + e[i].c;
45                 pre[v] = i;
46                 if (!vis[v]) q[++R] = v,vis[v] = true;
47             }
48         }
49         vis[u] = false;
50     }
51     return dis[T]!=INF;
52 }
53 void mcf() {
54     int zf = INF;
55     for (int i=T; i!=S; i=e[pre[i]].u)
56         zf = min(zf,e[pre[i]].f);
57     for (int i=T; i!=S; i=e[pre[i]].u)
58         e[pre[i]].f -= zf,e[pre[i]^1].f += zf;
59     Mf += zf;Mc += dis[T]*zf;
60 }
61 int main() {
62     int n = read(),c = read(),kt = read(),kc = read(),mt = read(),mc = read();
63     S = n*2+1;T = n*2+2;
64     for (int t,i=1; i<=n; ++i) {
65         t = read();
66         add_edge(S,i,t,0);
67         add_edge(i+n,T,t,0);
68         add_edge(S,i+n,INF,c);
69         if (i+kt<=n) add_edge(i,i+n+kt,INF,kc);
70         if (i+mt<=n) add_edge(i,i+n+mt,INF,mc);
71         if (i+1<=n) add_edge(i,i+1,INF,0);
72     }
73     while (spfa()) mcf();
74     printf("%d",Mc);
75     return 0;
76 }

原文地址:https://www.cnblogs.com/mjtcn/p/8541749.html

时间: 2024-10-10 08:43:20

LOJ #6008. 「网络流 24 题」餐巾计划的相关文章

「网络流24题」餐巾计划问题

题目描述 Description 一个餐厅在相继的 N 天里,每天需用的餐巾数不尽相同.假设第 i 天需要 ri块餐巾(i=1,2,…,N).餐厅可以购买新的餐巾,每块餐巾的费用为 p 分:或者把旧餐巾送到快洗部,洗一块需 m 天,其费用为 f 分:或者送到慢洗部,洗一块需 n 天(n>m),其费用为 s<f 分.每天结束时,餐厅必须决定将多少块脏的餐巾送到快洗部,多少块餐巾送到慢洗部,以及多少块保存起来延期送洗.但是每天洗好的餐巾和购买的新餐巾数之和,要满足当天的需求量.试设计一个算法为餐厅

[loj #6003]「网络流 24 题」魔术球 二分图最小路径覆盖,网络流

#6003. 「网络流 24 题」魔术球 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:Special Judge 上传者: 匿名 提交提交记录统计讨论测试数据 题目描述 假设有 n nn 根柱子,现要按下述规则在这 n nn 根柱子中依次放入编号为 1,2,3,4,? 1, 2, 3, 4, \cdots1,2,3,4,? 的球. 每次只能在某根柱子的最上面放球. 在同一根柱子中,任何 2 22 个相邻球的编号之和为完全平方数. 试设计一个算法,计算出在

LOJ #6010. 「网络流 24 题」数字梯形

#6010. 「网络流 24 题」数字梯形 题目描述 给定一个由 n nn 行数字组成的数字梯形如下图所示.梯形的第一行有 m mm 个数字.从梯形的顶部的 m mm 个数字开始,在每个数字处可以沿左下或右下方向移动,形成一条从梯形的顶至底的路径. 分别遵守以下规则: 从梯形的顶至底的 m mm 条路径互不相交: 从梯形的顶至底的 m mm 条路径仅在数字结点处相交: 从梯形的顶至底的 m mm 条路径允许在数字结点相交或边相交. 输入格式 第 1 11 行中有 2 22 个正整数 m mm 和

Loj #6000.「 网络流 24 题 」搭配飞行员

放图片是不是很骚气 解题思路 建立超级源点和超级汇点.将主驾驶雨源点相连,副驾驶与汇点相连,再把输入的有向边加进去,同时建反边. 跑$Dinic$,网络流模板不难,难的是建模QAQ 附上代码 #include <iostream> #include <cstring> #include <cstdio> #include <queue> using namespace std; const int maxnode = 105, maxedge = 30003

*LOJ#6227. 「网络流 24 题」最长k可重线段集问题

$n \leq 500$条平面上的线段,问一种挑选方法,使得不存在直线$x=p$与挑选的直线有超过$k$个交点,且选得的直线总长度最长. 横坐标每个点开一个点,一条线段就把对应横坐标连一条容量一费用(-长度)的边:点$x$向点$x+1$连一条容量$k$费用0的边.这里的$k$边限制的是直线上其他不经过这里的地方. 这里有个trick就是有与$x$轴垂直的线段.直接判掉会wa.为此把坐标扩大两倍,如果$l=r$那么$r++$否则$l++$,相当于把一个点拆成两个. 原文地址:https://www

LiberOJ #6013. 「网络流 24 题」负载平衡 最小费用最大流 供应平衡问题

#6013. 「网络流 24 题」负载平衡 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: 匿名 提交提交记录统计讨论测试数据 题目描述 G 公司有 n nn 个沿铁路运输线环形排列的仓库,每个仓库存储的货物数量不等.如何用最少搬运量可以使 n nn 个仓库的库存数量相同.搬运货物时,只能在相邻的仓库之间搬运. 输入格式 文件的第 1 11 行中有 1 11 个正整数 n nn,表示有 n nn 个仓库.第 2 22 行中有 n nn 个

【网络流24题】餐巾计划(图解)

LOJ 6008[网络流24题]餐巾计划 题解 一张图片说明建图方法: 解说: 这种建图方法完美区分开了"脏餐巾"和"干净餐巾"两种餐巾. 每天一定会有r[i]个脏餐巾,所以源点向每天的"脏餐巾"(图上used)连边,容量r[i],费用是0.另外,前一天的脏餐巾也可以留到下一天再处理,所以每天的used点向下一天的used点连一条边,容量INF,费用是0. 每天会需要r[i]个干净餐巾,所以每天的"干净餐巾"向汇点连边(图上n

LibreOJ #6001. 「网络流 24 题」太空飞行计划 最大权闭合图

#6001. 「网络流 24 题」太空飞行计划 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:Special Judge 上传者: 匿名 提交提交记录统计讨论测试数据 题目描述 W 教授正在为国家航天中心计划一系列的太空飞行.每次太空飞行可进行一系列商业性实验而获取利润.现已确定了一个可供选择的实验集合 E={E1,E2,?,Em} E = \{ E_1, E_2, \cdots, E_m \}E={E?1??,E?2??,?,E?m??},和进行这些实验

LiberOJ #6000. 「网络流 24 题」搭配飞行员 最大匹配

#6000. 「网络流 24 题」搭配飞行员 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: 匿名 提交提交记录统计讨论测试数据 题目描述 飞行大队有若干个来自各地的驾驶员,专门驾驶一种型号的飞机,这种飞机每架有两个驾驶员,需一个正驾驶员和一个副驾驶员.由于种种原因,例如相互配合的问题,有些驾驶员不能在同一架飞机上飞行,问如何搭配驾驶员才能使出航的飞机最多. 因为驾驶工作分工严格,两个正驾驶员或两个副驾驶员都不能同机飞行. 输入格式 第一