题目链接 \(Click\) \(Here\)

看到其他人都是用费用流写的,我只能表示:动什么脑子?暴力就完事了!

嗯,这个题应该是一个相当显然的上下界最小费用可行流模型,所以跑就完事了。

\(s -> inn (i)\) \(f = INF\) \(w = buy\) 新买

\(out (i) -> inn (i + fast)\) \(f = INF\) \(w = fastw\) 快洗

\(out(i) ->inn(i + slow)\) \(f = INF\) \(w = sloww\) 慢洗

\(out(i) -> T\) 不洗

\(inn(i)->out(i)\) \(f = [use[i],use[i]]\) \(w=0\) 不洗

还有一个小小的坑了我一下。

\(inn (i) -> inn (i + 1)\) \(f=INF\) \(w=0\) 洗完不用留着

就是这样,然后套路最小费用可行流即可。

#include <bits/stdc++.h>
#define int long long
#define INF 0x3f3f3f3f3f3f3f3f
#define N 4010
#define M 4000010
using namespace std; struct Graph {
int cnt, head[N]; struct edge {
int nxt, to, f, w;
}e[M]; void add_edge (int from, int to, int flw, int val) {
e[++cnt].nxt = head[from];
e[cnt].to = to;
e[cnt].f = flw;
e[cnt].w = val;
head[from] = cnt;
} Graph () {
cnt = -1;
memset (head, -1, sizeof (head));
}
}G1; namespace _EK {
int vis[N], dis[N], flow[N];
int pre_edge[N], pre_node[N]; queue <int> q;
#define fpop(x) x.front();x.pop() bool spfa (int s, int t, Graph &G) {
memset (vis, 0, sizeof (vis));
memset (dis, 0x3f, sizeof (dis));
memset (flow, 0x3f, sizeof (flow));
vis[s] = true, dis[s] = 0; q.push (s);
while (!q.empty ()) {
int u = fpop (q);
for (int i = G.head[u]; ~i; i = G.e[i].nxt) {
int v = G.e[i].to;
if (dis[v] > dis[u] + G.e[i].w && G.e[i].f) {
dis[v] = dis[u] + G.e[i].w;
flow[v] = min (flow[u], G.e[i].f);
pre_edge[v] = i;
pre_node[v] = u;
if (!vis[v]) {
vis[v] = true;
q.push (v);
}
}
}
vis[u] = false;
}
return dis[t] != INF;
}
} int EK (int s, int t, Graph &G) {
int max_flow = 0, min_cost = 0;
while (_EK :: spfa (s, t, G)) {
max_flow += _EK :: flow[t];
min_cost += _EK :: flow[t] * _EK :: dis[t];
int u = t;
while (u != s) {
G.e[_EK :: pre_edge[u] ^ 0].f -= _EK :: flow[t];
G.e[_EK :: pre_edge[u] ^ 1].f += _EK :: flow[t];
u = _EK :: pre_node[u];
}
}
return min_cost;
} void add_len (int u, int v, int f, int w) {
G1.add_edge (u, v, f, +w);
G1.add_edge (v, u, 0, -w);
} int n, bw, qt, st, qw, sw, use[N], flow[N]; int inn (int x) {return n * 0 + x;}
int out (int x) {return n * 1 + x;} signed main () {
freopen ("data.in", "r", stdin);
cin >> n;
int s = n * 2 + 1, t = n * 2 + 2;
int ss = n * 2 + 3, tt = n * 2 + 4;
for (int i = 1; i <= n; ++i) cin >> use[i];
cin >> bw >> qt >> qw >> st >> sw;
for (int i = 1; i <= n; ++i) {
add_len (s, inn (i), INF, bw);
add_len (out (i), t, INF, 00);
if (i + qt <= n) add_len (out (i), inn (i + qt), INF, qw);
if (i + st <= n) add_len (out (i), inn (i + st), INF, sw);
flow[out (i)] += use[i];
flow[inn (i)] -= use[i];
}
for (int i = 1; i < n; ++i) {
add_len (inn (i), inn (i + 1), INF, 0);
}
for (int i = inn (1); i <= out (n); ++i) {
if (flow[i] > 0) add_len (ss, i, +flow[i], 0);
if (flow[i] < 0) add_len (i, tt, -flow[i], 0);
}
add_len (t, s, INF, 0);
cout << EK (ss, tt, G1) << endl;
}

Luogu P1251 餐巾计划问题的更多相关文章

  1. 洛谷 P1251 餐巾计划问题(线性规划网络优化)【费用流】

    (题外话:心塞...大部分时间都在debug,拆点忘记加N,总边数算错,数据类型标错,字母写错......) 题目链接:https://www.luogu.org/problemnew/show/P1 ...

  2. P1251 餐巾计划问题

    P1251 餐巾计划问题 题目描述 一个餐厅在相继的 N 天里,每天需用的餐巾数不尽相同.假设第 iii 天需要 rir_iri​块餐巾( i=1,2,...,N).餐厅可以购买新的餐巾,每块餐巾的费 ...

  3. P1251 餐巾计划问题 网络流

    P1251 餐巾计划问题 #include <bits/stdc++.h> using namespace std; typedef long long ll; , inf = 0x3f3 ...

  4. 【Luogu】P1251餐巾计划(上下界费用流)

    题目链接 学了一下上下界费用流,似乎很nb.但是我说得不好,所以这里给出博客链接. 某dalao的博客 然后这道题的解法就是先用上下界费用流的建图方式连早上和晚上之间的那条边,保证当天一定会有r条或以 ...

  5. 网络流之最小费用最大流 P1251 餐巾计划问题

    题目描述 一个餐厅在相继的 NN 天里,每天需用的餐巾数不尽相同.假设第 ii 天需要 r_iri​块餐巾( i=1,2,...,N).餐厅可以购买新的餐巾,每块餐巾的费用为 pp 分;或者把旧餐巾送 ...

  6. 网络流24题 P1251 餐巾计划问题 拆点

    题目描述 一个餐厅在相继的 NN 天里,每天需用的餐巾数不尽相同.假设第 ii 天需要 r_iri​块餐巾( i=1,2,...,N).餐厅可以购买新的餐巾,每块餐巾的费用为 pp 分;或者把旧餐巾送 ...

  7. P1251 餐巾计划问题 费用流

    https://www.luogu.org/problemnew/show/P1251 题意 有一家酒店,酒店每天需要ri张桌布,桌布可以现买,p元.可以通过快洗店,等m天,f元.可以通过慢洗店,等n ...

  8. 洛谷P1251 餐巾计划问题(费用流)

    传送门 不得不说这题真是思路清奇,真是网络流的一道好题,完全没想到网络流的建图还可以这么建 我们把每一个点拆成两个点,分别表示白天和晚上,白天可以得到干净的餐巾(购买的,慢洗的,快洗的),晚上可以得到 ...

  9. [洛谷P1251]餐巾计划问题

    题目大意:一个餐厅N天,每天需要$r_i$块餐巾.每块餐巾需要p元,每天用过的餐巾变脏,不能直接用.现在有快洗店和慢洗店,快洗店洗餐巾需要m天,每块花费f元:慢洗店洗餐巾需要n天,每块餐巾s元(m & ...

随机推荐

  1. SpringBoot之通过yaml绑定注入数据

    依赖包: <!--配置文件注解提示包--> <dependency> <groupId>org.springframework.boot</groupId&g ...

  2. 手写事务管理器 也是spring实现事务管理的原理

  3. python与java的内存机制不一样;java的方法会进入方法区直到对象消失 方法才会消失;python的方法是对象每次调用都会创建新的对象 内存地址都不i一样

    python与java的内存机制不一样;java的方法会进入方法区直到对象消失 方法才会消失;python的方法是对象每次调用都会创建新的对象 内存地址都不i一样

  4. JarvisOJ Basic easyRSA

    还记得veryeasy RSA吗?是不是不难?那继续来看看这题吧,这题也不难. 已知一段RSA加密的信息为:0xdc2eeeb2782c且已知加密所用的公钥: (N=322831561921859 e ...

  5. django--orm关系字段(ForeignKey、OneToOneField、ManyToManyField)详解

    django中的关系字段 1.ForeignKey字段,即外键字段,对应一对多的情况,列如:一本书对应一个出版社,一个出版社可对应多本书. 2.ManyToManyFiled字段,即多对多字段,对应数 ...

  6. Oracle查看表空间,创建表空间

    查看表空间: SELECT tablespace_name, file_id, file_name, round(bytes / (1024 * 1024), 0) total_space FROM ...

  7. Python Argparse模块

    argparse模块 在Python中,argparse模块是标准库中用来解析命令行参数的模块,用来替代已经过时的optparse模块.argparse模块能够根据程序中的定义从sys.argv中解析 ...

  8. Docker自制CentOS镜像

    系统环境:CentOS 7.3 将yum源切换到阿里源 可以直接写成一个脚本 #!/bin/sh mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos ...

  9. hadoop安装要领

    1.安装JDK tar -zxvf jdk-7u75-linux-i586.tar.gz -C /root/training/ vi ~/.bash_profile JAVA_HOME=/root/t ...

  10. BZOJ5037[Jsoi2014]电信网络——最大权闭合子图

    题目描述 JYY创建的电信公司,垄断着整个JSOI王国的电信网络.JYY在JSOI王国里建造了很多的通信基站.目前所有的基站 都是使用2G网络系统的.而现在3G时代已经到来了,JYY在思考,要不要把一 ...