题意

有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: 序列 (最大费用流)的更多相关文章

  1. [bzoj 1449] 球队收益(费用流)

    [bzoj 1449] 球队收益(费用流) Description Input Output 一个整数表示联盟里所有球队收益之和的最小值. Sample Input 3 3 1 0 2 1 1 1 1 ...

  2. BZOJ 1283: 序列

    1283: 序列 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 272  Solved: 151[Submit][Status][Discuss] D ...

  3. BZOJ.2597.[WC2007]剪刀石头布(费用流zkw)

    BZOJ 洛谷 \(Description\) 给定一张部分边方向已确定的竞赛图.你需要给剩下的边确定方向,使得图中的三元环数量最多. \(n\leq100\). \(Solution\) 这种选择之 ...

  4. bzoj 1070: [SCOI2007]修车 费用流

    1070: [SCOI2007]修车 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 2785  Solved: 1110[Submit][Status] ...

  5. BZOJ1283 序列(费用流)

    不妨看做是先用k个指针指向被选择的前k个元素,然后每次将选中当前第一个元素的指针移到最后,并且需要满足位置变化量>=m.显然这样可以构造出所有的合法方案.那么可以以此建立费用流模型,以一条流量k ...

  6. BZOJ 3171 循环格(费用流)

    题意 一个循环格就是一个矩阵,其中所有元素为箭头,指向相邻四个格子.每个元素有一个坐标(行,列),其中左上角元素坐标为(0,0).给定一个起始位置(r,c),你可以沿着箭头防线在格子间行走.即如果(r ...

  7. BZOJ 1070 修车 【费用流】

    Description 同一时刻有N位车主带着他们的爱车来到了汽车维修中心.维修中心共有M位技术人员,不同的技术人员对不同 的车进行维修所用的时间是不同的.现在需要安排这M位技术人员所维修的车及顺序, ...

  8. BZOJ 1930 吃豆豆(费用流)

    首先这题的两条线不相交的限制可以去掉,因为如果相交的话把点换一换是不影响最终结果的. 剩下的费用流建图是显然的,把点拆为两个,建立超级源点s和源点ss汇点t,连边(s,ss,2,0). 对于每个点,连 ...

  9. BZOJ 1927 星际竞速(费用流)

    考虑费用流,题目要求走n个点都走完且恰好一次,显然流量的限制为n. 建立源点s和汇点t,并把每个星球拆成两个点i和i',分别表示已到达该点和经过该点. 对于能力爆发,建边(s,i',1,w). 对应高 ...

随机推荐

  1. JavaWeb开发常用的前端控件

    罗列的下述控件大多依赖jquery插件,故可提前导入jquery插件以免出错 Validform 提供对表单的验证.提交等功能,具体可查阅其官方文档>>>Validform 示例如下 ...

  2. idea调试框架时如何能够进入maven依赖包的源码

    最近用idea使用spring security做登录与权限控制,在调试过程中碰到问题,经常需要断点追踪源码,深入查看其中问题.但是maven中引用的包,进入后都是.class文件,非源码.导致查看时 ...

  3. 注意了,Mybatis中条件判断时遇到的坑

    1.mapper中比较字符串时需要注意的问题如下: mybatis 映射文件中,if标签判断字符串相等,两种方式:因为mybatis映射文件,是使用的ognl表达式,所以在判断字符串isComplet ...

  4. (一)Spring概念

    目录 Spring是开源的轻量级框架 Spring核心 Spring是一站式的框架 Spring版本 Spring是开源的轻量级框架 开源是什么,不用多说: 轻量级:Spring框架的使用,不需要依赖 ...

  5. HDU 1811 并查集+拓扑排序

    Rank of Tetris 题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1811 Problem Description 自从Lele开发了Rati ...

  6. 【leetcode】【二分 | 牛顿迭代法】69_Sqrt(x)

    题目链接:传送门 题目描述: 求Sqrt(x),返回整数值即可. [代码]: #include<bits/stdc++.h> using namespace std; ; /* int m ...

  7. 论文阅读:Adaptive NMS: Refining Pedestrian Detection in a Crowd

    论文阅读:Adaptive NMS: Refining Pedestrian Detection in a Crowd 2019年04月11日 23:08:02 Kivee123 阅读数 836   ...

  8. windows连接远程服务器报错'SSH' 不是内部或外部命令,也不是可运行的程序 或批处理文件 解决方案

    网上在windows下连接远程服务器的步骤如下: 1.打开cmd命令行窗口 2.输入cd ~/.ssh,进入c盘下的.ssh文件 3.输入“ssh root@远程服务器的ip地址”连接远程服务器, b ...

  9. 解决设置了display:none的元素,会先展示再隐藏

    问题:元素明明设置了display:none,但是在刷新页面的时候却会先显示了出来,然后才会隐藏,实现display:none 原因:由于元素渲染的时候,样式还没有应用上去,导致的 解决办法:使用内联 ...

  10. MongoDB divide 使用之mongotempalte divide

    需求:求一组数的两个字段计算结果的平均值 如有一组这样的数: 列名1 列名2 列名3 第一组数   a       2       5 第二组数   b       4       8 按照列名1分组 ...