BZOJ 1283: 序列 (最大费用流)
题意
有n个正整数,要选取里面的一些数,在保证每m个连续的数中最多选k个的情况下,使得得到的值最大.
分析
我们可以把问题先转化为选k次,每一次每m个数只能选一个.那么根据贪心的策略,每m个里一定会选一个.那么先建一个源点S,一个汇点T,连边就先用容量为k,费用为0的边把S,数组,T顺次连起来,然后每一个位置i向i+m(如果>n就连向T)连一条容量为1,费用为a[i]的边.做最大费用流即可.
CODE
#include <queue>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAXN = 1005;
const int MAXM = 5005;
const int inf = 1e9;
int n, m, k, S, T, fir[MAXN], info[MAXN], cnt;
struct edge { int to, nxt, c, w; }e[MAXM];
inline void add(int u, int v, int cc, int ww) {
e[cnt] = (edge) { v, fir[u], cc, ww }, fir[u] = cnt++;
e[cnt] = (edge) { u, fir[v], 0, -ww }, fir[v] = cnt++;
}
int dis[MAXN], Ans; deque<int>q;
bool inq[MAXN], vis[MAXN];
inline bool spfa() {
memset(dis, 0x3f, sizeof dis);
q.push_back(T); dis[T] = 0;
while(!q.empty()) {
int u = q.front(), v; q.pop_front(); inq[u] = 0;
for(int i = fir[u]; ~i; i = e[i].nxt)
if(e[i^1].c && dis[v=e[i].to] > dis[u] + e[i^1].w) {
dis[v] = dis[u] + e[i^1].w;
if(!inq[v]) {
inq[v] = 1;
if(!q.empty() && dis[v] < dis[q.front()]) q.push_front(v);
else q.push_back(v);
}
}
}
return dis[S] < inf;
}
int aug(int u, int Max) {
if(u == T) { Ans += Max * dis[S]; return Max; }
int delta, flow = 0, v;
vis[u] = 1;
for(int &i = info[u]; ~i; i = e[i].nxt)
if(e[i].c && dis[v=e[i].to] + e[i].w == dis[u] && !vis[v]) {
delta = aug(v, min(Max-flow, e[i].c));
e[i].c -= delta, e[i^1].c += delta;
if((flow+=delta) == Max) break;
}
vis[u] = 0;
return flow;
}
inline int dinic() {
Ans = 0;
while(spfa())
memcpy(info, fir, (T+1)<<2), aug(S, inf);
return Ans;
}
int main () {
memset(fir, -1, sizeof fir);
scanf("%d%d%d", &n, &m, &k);
S = 0, T = n+1;
for(int i = 1, x; i <= n; ++i) {
scanf("%d", &x);
add(i-1, i, k, 0);
add(i, min(i+m, n+1), 1, -x);
}
add(n, n+1, k, 0);
printf("%d\n", -dinic());
}
BZOJ 1283: 序列 (最大费用流)的更多相关文章
- [bzoj 1449] 球队收益(费用流)
[bzoj 1449] 球队收益(费用流) Description Input Output 一个整数表示联盟里所有球队收益之和的最小值. Sample Input 3 3 1 0 2 1 1 1 1 ...
- BZOJ 1283: 序列
1283: 序列 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 272 Solved: 151[Submit][Status][Discuss] D ...
- BZOJ.2597.[WC2007]剪刀石头布(费用流zkw)
BZOJ 洛谷 \(Description\) 给定一张部分边方向已确定的竞赛图.你需要给剩下的边确定方向,使得图中的三元环数量最多. \(n\leq100\). \(Solution\) 这种选择之 ...
- bzoj 1070: [SCOI2007]修车 费用流
1070: [SCOI2007]修车 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 2785 Solved: 1110[Submit][Status] ...
- BZOJ1283 序列(费用流)
不妨看做是先用k个指针指向被选择的前k个元素,然后每次将选中当前第一个元素的指针移到最后,并且需要满足位置变化量>=m.显然这样可以构造出所有的合法方案.那么可以以此建立费用流模型,以一条流量k ...
- BZOJ 3171 循环格(费用流)
题意 一个循环格就是一个矩阵,其中所有元素为箭头,指向相邻四个格子.每个元素有一个坐标(行,列),其中左上角元素坐标为(0,0).给定一个起始位置(r,c),你可以沿着箭头防线在格子间行走.即如果(r ...
- BZOJ 1070 修车 【费用流】
Description 同一时刻有N位车主带着他们的爱车来到了汽车维修中心.维修中心共有M位技术人员,不同的技术人员对不同 的车进行维修所用的时间是不同的.现在需要安排这M位技术人员所维修的车及顺序, ...
- BZOJ 1930 吃豆豆(费用流)
首先这题的两条线不相交的限制可以去掉,因为如果相交的话把点换一换是不影响最终结果的. 剩下的费用流建图是显然的,把点拆为两个,建立超级源点s和源点ss汇点t,连边(s,ss,2,0). 对于每个点,连 ...
- BZOJ 1927 星际竞速(费用流)
考虑费用流,题目要求走n个点都走完且恰好一次,显然流量的限制为n. 建立源点s和汇点t,并把每个星球拆成两个点i和i',分别表示已到达该点和经过该点. 对于能力爆发,建边(s,i',1,w). 对应高 ...
随机推荐
- 【剑指OFFER】链表中倒数第k个结点
[问题描述] 输入一个链表,输出该链表中倒数第k个结点. 时间限制:1秒 空间限制:32768K [AC代码] p先走k步,q再走,这样p和q的距离就是k了,等p走到尽头,那么q自然就到了倒数第k个位 ...
- Ubuntu 下开发ARM
1. 准备工作 linux下自带虚拟串口的驱动,不需要手动安装.CP2102之类的USB转串口,是ttyUSBx. 所有的设备都在/dev目录下,简单扫描串口的办法: ls /dev > bef ...
- 从入门到自闭之Python解释器安装
Python解释器的安装 1 下载 下载地址:https://www.python.org 选择windows平台的链接进行下载 https://www.python.org/downloads/ ...
- 二进制协议gob和msgpack介绍
二进制协议gob和msgpack介绍 本文主要介绍二进制协议gob及msgpack的基本使用. 最近在写一个gin框架的session服务时遇到了一个问题,Go语言中的json包在序列化空接口存放的数 ...
- S02_CH14_ EMIO_OLED 实验
S02_CH14_ EMIO_OLED 实验 本章将使用EMIO模拟OLED的时序来驱动OLED,本方案对米联系列Miz702,Miz702N和Miz701N全兼容. 14.1板载OLED硬件原理 M ...
- Hexo折腾记--小白修改新主题
UPDATE 2019.5.28 不好意思我又换了个新主题ARIA啦...这回没有个人定制了 前言 如果您曾经来过我的博客,就会发现我的个人博客(https://rye-catcher.github. ...
- javaIO——AutoCloseable 小试
前面在 IO 概述篇提到过,AutoCloseable 接口类会自动调用 close() 方法,那究竟具体怎么写呢?以及发生异常情况下或者多个资源是不是都能自动调用呢?我们来写一个简单的类测试一下就知 ...
- JSON格式互转集合 (2)
public class JSON { public static string DateTimeFormat = "yyyy'-'MM'-'dd'T'HH':'mm':'ss"; ...
- Ubuntu12.04 root登陆方法【保证有效】
su -取得root权限后,gedit /etc/lightdm/lightdm.conf ,里面的内容全部改为 [SeatDefaults] greeter-session=unity-greete ...
- TypeScript入门四:TypeScript的类(class)
TypeScript类的基本使用(修饰符) TypeScript类的抽象类(abstract) TypeScript类的高级技巧 一.TypeScript类的基本使用(修饰符) TypeScript的 ...