这道题其实我在刚学 OI 的时候就在一本通上看见过,还记得上面写着“新餐巾一次性买完”之类的话。当时还很稚嫩(现在也是),想了好久,根本想不出来。

学了网络流之后发现这道题的图也是挺好构造的。 以

样例
3
1 7 5
11 2 2 3 1

为例:



先拆点。



每天都可以买最多 \(+\infty\) 张餐巾,单价为 \(p\)。给源点和所有的上半点连容量为 \(+\infty\),费用为 \(p\) 的有向边。除此之外,每天的新餐巾也可以免费送到下一天,连上相应的有向边。



第 \(i\) 天需要 \(r_i\) 张餐巾,即第 \(i\) 天的上半点会向下半点流出 \(r_i\) 张脏餐巾,费用为 \(0\)。这里要稍作处理,让上半点的 \(d_i\) 张脏餐巾流往汇点;为了补偿下半点,允许源点往下半点流 \(d_i\) 张免费的脏餐巾。之所以这么做,是因为我们要求上午用去的餐巾数为 \(d_i\),而不是要求下午不送洗的餐巾数为 \(d_i\)。



慢洗和快洗分别会向 \(m\) 天和 \(n\) 天后流出新餐巾,每天最多可以洗 \(+\infty\) 张,费用分别为 \(f\),\(s\)。在这里慢洗部由于太慢,最终无法派上用场。

这张图的最大流最小费用就是答案。

#include <cstdio>
#include <cstring>
#include <queue> inline int min(const int& a, const int& b){
return a < b ? a : b;
} const int MAXN = 4e3 + 19, MAXM = 8e4 + 19, INF = 0x3f3f3f3f; struct Edge{
int to, next, c, dist;
}edge[MAXM << 1]; int cnt = -1, head[MAXN]; inline void add(int from, int to, int c, int dist){
edge[++cnt].to = to;
edge[cnt].c = c;
edge[cnt].dist = dist;
edge[cnt].next = head[from];
head[from] = cnt;
} int N, p, m, f, n, s; int dist[MAXN], flow[MAXN], pre[MAXN]; int spfa(void){
std::queue<int>q; q.push(0);
std::memset(dist, 0x3f, sizeof dist); dist[0] = 0;
std::memset(flow, 0x3f, sizeof flow);
while(!q.empty()){
int node = q.front(); q.pop();
for(int i = head[node]; i != -1; i = edge[i].next)
if(edge[i].c && dist[edge[i].to] > dist[node] + edge[i].dist){
dist[edge[i].to] = dist[node] + edge[i].dist;
flow[edge[i].to] = min(flow[node], edge[i].c);
pre[edge[i].to] = i;
q.push(edge[i].to);
}
}
if(flow[N + N + 1] == 0x3f3f3f3f)
return 0;
return flow[N + N + 1];
} void edmondsKarp(long long& fee){
while(spfa()){
fee += (long long)flow[N + N + 1] * (long long)dist[N + N + 1];
for(int i = N + N + 1; i; i = edge[pre[i] ^ 1].to)
edge[pre[i]].c -= flow[N + N + 1], edge[pre[i] ^ 1].c += flow[N + N + 1];
}
} int main(){
std::memset(head, -1, sizeof head);
std::scanf("%d%d%d%d%d%d", &N, &p, &m, &f, &n, &s);
for(int d, i = 1; i <= N; ++i){
std::scanf("%d", &d);
add(i, N + N + 1, d, 0), add(N + N + 1, i, 0, 0);
add(0, i + N, d, 0), add(i + N, 0, 0, 0);
}
for(int i = 1; i <= N; ++i)
add(0, i, INF, p), add(i, 0, 0, -p);
for(int i = 1; i < N; ++i)
add(i, i + 1, INF, 0), add(i + 1, i, 0, 0);
for(int i = 1; i + m <= N; ++i)
add(i + N, i + m, INF, f), add(i + m, i + N, 0, -f);
for(int i = 1; i + n <= N; ++i)
add(i + N, i + n, INF, s), add(i + n, i + N, 0, -s);
long long ans = 0; edmondsKarp(ans);
printf("%lld\n", ans);
return 0;
}

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

  1. LibreOJ #6008. 「网络流 24 题」餐巾计划 最小费用最大流 建图

    #6008. 「网络流 24 题」餐巾计划 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: 匿名 提交提交记录统计讨论测试数据   题目描述 ...

  2. Libre 6008 「网络流 24 题」餐巾计划 (网络流,最小费用最大流)

    Libre 6008 「网络流 24 题」餐巾计划 (网络流,最小费用最大流) Description 一个餐厅在相继的N天里,第i天需要Ri块餐巾(i=l,2,-,N).餐厅可以从三种途径获得餐巾. ...

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

    #6008. 「网络流 24 题」餐巾计划 题目描述 一个餐厅在相继的 n nn 天里,每天需用的餐巾数不尽相同.假设第 i ii 天需要 ri r_ir​i​​ 块餐巾.餐厅可以购买新的餐巾,每块餐 ...

  4. [luogu_P1251][LOJ#6008]「网络流 24 题」餐巾计划

    [luogu_P1251][LOJ#6008]「网络流 24 题」餐巾计划 试题描述 一个餐厅在相继的 \(N\) 天里,第 \(i\) 天需要 \(R_i\) 块餐巾 \((i=l,2,-,N)\) ...

  5. 【刷题】LOJ 6008 「网络流 24 题」餐巾计划

    题目描述 一个餐厅在相继的 \(n\) 天里,每天需用的餐巾数不尽相同.假设第 \(i\) 天需要 \(r_i\) 块餐巾.餐厅可以购买新的餐巾,每块餐巾的费用为 \(P\) 分:或者把旧餐巾送到快洗 ...

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

    #6013. 「网络流 24 题」负载平衡 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: 匿名 提交提交记录统计讨论测试数据   题目描述 ...

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

    二次联通门 : LibreOJ #6000. 「网络流 24 题」搭配飞行员 /* LibreOJ #6000. 「网络流 24 题」搭配飞行员 二分图最大匹配 Dinic最大流 + 当前弧优化 */ ...

  8. LibreOJ #6014. 「网络流 24 题」最长 k 可重区间集

    #6014. 「网络流 24 题」最长 k 可重区间集 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: 匿名 提交提交记录统计讨论测试数据   ...

  9. LIbreOJ #6011. 「网络流 24 题」运输问题 最小费用最大流

    #6011. 「网络流 24 题」运输问题 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: 匿名 提交提交记录统计讨论测试数据   题目描述 ...

随机推荐

  1. Laravel Vuejs 实战:开发知乎 (6)发布问题

    1.view部分: 安装一个扩展包:Laravel-UEditor composer require "overtrue/laravel-ueditor:~1.0" 配置 添加下面 ...

  2. js函数声明外面使用小括号括起来再接一个小括号的写法

    js函数声明外面使用小括号括起来再接一个小括号的写法 (function(){})(); (function(){}()); !function(){}(); 总结ps:意思将函数声明变成,直接执行的 ...

  3. SpringCloud全家桶学习之分布式配置中心----Config(七)

    一.概述 (1)背景 微服务意味着将单体应用中的业务拆分成一个个子服务,每个服务的粒度相对较小,因此系统中出现大量的服务.由于每个服务都需要配置必要的配置信息才能运行,所以一套集中式的.动态的配置管理 ...

  4. linux python3编译以及 卸载,python默认为python3 ,pip默认为pip3,亲测版

    前置准备yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-de ...

  5. xshell 快捷键总结

    ##快捷键 linux tab == 命令补全,路径补全.如果tab不到,就代表对于当前用户环境系统找不到这个目录或者路径,有可能有,但是没有放在PATH中 ctrl + a == a:26个字母的第 ...

  6. 使用URLConnection获取页面返回的xml数据

    public static void main(String[] args) throws Exception { String path="http://flash.weather.com ...

  7. SpringBoot与Mybatis整合(包含generate自动生成代码工具,数据库表一对一,一对多,关联关系中间表的查询)

    链接:https://blog.csdn.net/YonJarLuo/article/details/81187239 自动生成工具只是生成很单纯的表,复杂的一对多,多对多的情况则是在建表的时候就建立 ...

  8. ANSYS初始残余应力赋值

    目录 1.建模 2.划分网格并分组 3.所有节点固定约束 4.施加初始残余应力 5.结果 1.建模 建立有限元模型,采用SOLID185单元,模型尺寸0.050.050.02 材料为钢 !程序头 FI ...

  9. 「AT2381 [AGC015C] Nuske vs Phantom Thnook」

    题目大意 给出一个01矩阵,这个矩阵有一个特殊的性质: 对于任意两个 \(1\) 之间最多只有 \(1\) 条由 \(1\) 构成的路径.每次询问给出一个矩形范围,查询在这个范围内的联通快个数. 分析 ...

  10. mssql-osql

    mssql导入单行字段值非常长,或者sql文件非常大,比如上百M或者更大,常规方法是导不进去的,所以推荐下面方式进行导入. osql -S . -U sa -P 123456 -d TS_TEST - ...