题目链接 \(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. case when 空值判断

    在对数据库进行查询时,遇到了一个问题:查询结果中的某一列需要判断另一列是否为空的来确定值,自然就想到了case when,于是写出了下面的SQL(其他部分省略): (case date when nu ...

  2. JSON in SQL Server 2016

    JSON functions in SQL Server enable you to analyze and query JSON data, transform JSON to relational ...

  3. SharePoint 2013 使用 RBS 功能将二进制大型对象 BLOB 存储在内容数据库外部。

    为每个内容数据库设置 BLOB 存储   启用并配置 FILESTREAM 之后,请按照以下过程在文件系统中设置 BLOB 存储.必须为要对其使用 RBS 的每个内容数据库设置 BLOB 存储. 设置 ...

  4. codeforces525B

    Pasha and String CodeForces - 525B Pasha got a very beautiful string s for his birthday, the string ...

  5. codeforces509B

    Painting Pebbles CodeForces - 509B There are n piles of pebbles on the table, the i-th pile contains ...

  6. BZOJ4372烁烁的游戏——动态点分治+线段树(点分树套线段树)

    题目描述 背景:烁烁很喜欢爬树,这吓坏了树上的皮皮鼠.题意:给定一颗n个节点的树,边权均为1,初始树上没有皮皮鼠.烁烁他每次会跳到一个节点u,把周围与他距离不超过d的节点各吸引出w只皮皮鼠.皮皮鼠会被 ...

  7. python的小练习

    # -*- coding: utf-8 -*- """练习:有1,2,3,4. 4个数能组成多少个互不相同且无重复数字的三位数,分别是多少?""&qu ...

  8. Codeforces Round #530 (Div. 2) F (树形dp+线段树)

    F. Cookies 链接:http://codeforces.com/contest/1099/problem/F 题意: 给你一棵树,树上有n个节点,每个节点上有ai块饼干,在这个节点上的每块饼干 ...

  9. Navicat再次激活

    换了个新电脑,上一次激活用的注册机老被杀掉,defender什么的都关了,不知道是谁在暗中保护我的电脑.. 上个激活参考:https://www.cnblogs.com/MC-Curry/p/9765 ...

  10. CF280C Game on Tree

    题目链接 : CF280C Game on Tree 题意 : 给定一棵n个节点的树T 根为一(我咕的翻译漏掉了...) 每次随机选择一个未被删除的点 并将它的子树删除 求删整棵树的期望步数 n ∈ ...