BZOJ3550: [ONTAK2010]Vacation
3550: [ONTAK2010]Vacation
Time Limit: 10 Sec Memory Limit: 96 MB
Submit: 91 Solved: 71
[Submit][Status]
Description
有3N个数,你需要选出一些数,首先保证任意长度为N的区间中选出的数的个数<=K个,其次要保证选出的数的个数最大。
Input
第一行两个整数N,K。
第二行有3N个整数。
Output
一行一个整数表示答案。
Sample Input
14 21 9 30 11 8 1 20 29 23 17 27 7 8 35
Sample Output
HINT
【数据范围】
N<=200,K<=10。
Source
s=;t=*n+;
for1(i,*n)a[i]=read();
insert(s,,k,);insert(*n+,t,k,);
for1(i,n)insert(,i+,,-a[i]);
for2(i,n+,*n)insert(i-n+,i+,,-a[i]);
for2(i,*n+,*n)insert(i-n+,*n+,,-a[i]);
for1(i,*n+)insert(i,i+,inf,);
需要搞清楚a[i]在哪个等式中第一次出现,在哪个等式中第二次出现,以及正负号各是什么。
b[i]的出现很显然,i为正,i+1为负
然后求最大费用最大流就可以过了。
代码:
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<vector>
#include<map>
#include<set>
#include<queue>
#include<string>
#define inf 1000000000
#define maxn 1000
#define maxm 100000
#define eps 1e-10
#define ll long long
#define pa pair<int,int>
#define for0(i,n) for(int i=0;i<=(n);i++)
#define for1(i,n) for(int i=1;i<=(n);i++)
#define for2(i,x,y) for(int i=(x);i<=(y);i++)
#define for3(i,x,y) for(int i=(x);i>=(y);i--)
#define mod 1000000007
using namespace std;
inline int read()
{
int x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=*x+ch-'';ch=getchar();}
return x*f;
}
int n,m,k,mincost,tot=,s,t,a[maxn],head[maxn],q[maxm],d[maxn],from[*maxm];
bool v[maxn];
struct edge{int from,next,go,v,c;}e[*maxm];
void ins(int x,int y,int z,int w)
{
e[++tot].go=y;e[tot].from=x;e[tot].v=z;e[tot].c=w;e[tot].next=head[x];head[x]=tot;
}
void insert(int x,int y,int z,int w)
{
ins(x,y,z,w);ins(y,x,,-w);
}
bool spfa()
{
for (int i=s;i<=t;i++){v[i]=;d[i]=inf;}
int l=,r=,y;q[]=s;d[s]=;v[]=;
while(l!=r)
{
int x=q[++l];if(l==maxn)l=;v[x]=;
for (int i=head[x];i;i=e[i].next)
if(e[i].v&&d[x]+e[i].c<d[y=e[i].go])
{
d[y]=d[x]+e[i].c;from[y]=i;
if(!v[y]){v[y]=;q[++r]=y;if(r==maxn)r=;}
}
}
return d[t]!=inf;
}
void mcf()
{
while(spfa())
{
int tmp=inf;
for(int i=from[t];i;i=from[e[i].from]) tmp=min(tmp,e[i].v);
mincost+=d[t]*tmp;
for(int i=from[t];i;i=from[e[i].from]){e[i].v-=tmp;e[i^].v+=tmp;}
}
}
int main()
{
freopen("input.txt","r",stdin);
freopen("output.txt","w",stdout);
n=read();k=read();
s=;t=*n+;
for1(i,*n)a[i]=read();
insert(s,,k,);insert(*n+,t,k,);
for1(i,n)insert(,i+,,-a[i]);
for2(i,n+,*n)insert(i-n+,i+,,-a[i]);
for2(i,*n+,*n)insert(i-n+,*n+,,-a[i]);
for1(i,*n+)insert(i,i+,inf,);
mcf();
printf("%d\n",-mincost);
return ;
}
就当我懂了T_T
BZOJ3550: [ONTAK2010]Vacation的更多相关文章
- BZOJ3550 [ONTAK2010]Vacation 【单纯形】
题目链接 BZOJ3550 题解 单纯形裸题 题意不清,每个位置最多选一次 #include<algorithm> #include<iostream> #include< ...
- bzoj3550: [ONTAK2010]Vacation(单纯形法+线性规划)
传送门 直接暴力把线性规划矩阵给打出来然后单纯形求解就行了 简单来说就是每个数记一个\(d_i\)表示选或不选,那么就是最大化\(\sum d_ic_i\),并满足一堆限制条件 然后不要忘记限制每个数 ...
- bzoj3550: [ONTAK2010]Vacation&&bzoj3112: [Zjoi2013]防守战线
学了下单纯形法解线性规划 看起来好像并不是特别难,第二个code有注释.我还有...*=-....这个不是特别懂 第一个是正常的,第二个是解对偶问题的 #include<cstdio> # ...
- BZOJ_3550_[ONTAK2010]Vacation&&BZOJ_1283:_序列_网络流解线性规划
BZOJ_3550_[ONTAK2010]Vacation&&BZOJ_1283:_序列_网络流解线性规划 Description 给出一个长度为 的正整数序列Ci,求一个子序列,使得 ...
- BZOJ 3550: [ONTAK2010]Vacation [单纯形法]
有3N个数,你需要选出一些数,首先保证任意长度为N的区间中选出的数的个数<=K个,其次要保证选出的数的个数最大. 好像都是费用流... 单纯性裸题呀... 注意每个数最多选1次 #include ...
- 【BZOJ1283/3550】序列/[ONTAK2010]Vacation 最大费用流
[BZOJ1283]序列 Description 给出一个长度为 的正整数序列Ci,求一个子序列,使得原序列中任意长度为 的子串中被选出的元素不超过K(K,M<=100) 个,并且选出的元素之和 ...
- BZOJ 3550 ONTAK2010 Vacation 单纯形
题目大意:给定一个长度为3n的区间.要求选一些数,且随意一段长度为n的区间内最多选k个数.求选择数的和的最大值 单纯形直接搞 注意一个数仅仅能被选一次 因此要加上xi<=1这个约束条件 不明确3 ...
- 【Richard 的刷(水)题记录】
大概想了想,还是有个记录比较好. 9/24 网络流一日游: 最大流:bzoj1711[Usaco2007 Open]Dining 拆点 BZOJ 3993 Sdoi2015 星际战争 二分 P.S.这 ...
- 【BZOJ】【3550】【ONTAK2010】Vacation
网络流/费用流 Orz太神犇了这题…… 我一开始想成跟Intervals那题一样了……每个数a[i]相当于覆盖了(a[i]-n,a[i]+n)这个区间……但是这样是错的!!随便就找出反例了……我居然还 ...
随机推荐
- XML DOM 循环(foreach)读取PHP数据 和 PHP 编写 XML DOM 【转载】
用 PHP 读取和编写可扩展标记语言(XML)看起来可能有点恐怖.实际上,XML 和它的所有相关技术可能是恐怖的,但是用 PHP 读取和编写 XML 不一定是项恐怖的任务.首先,需要学习一点关于 XM ...
- 入门必须掌握8个DOS命令
一,ping 它是用来检查网络是否通畅或者网络连接速度的命令.作为一个生活在网络上的管理员或者黑客来说,ping命令是第一个必须掌握的DOS命令,它所利用的原理是这样的:网络上的机器都有唯一确定的IP ...
- 理解C#系列 / 核心C# / 数据类型
数据类型 数据类型 C#把数据类型分为两种:值类型和引用类型. 值类型和引用类型 值类型的变量直接指向存储的值,引用类型的变量指向值的引用.[理解:引用就像一个柜子的号码牌,可以顺藤摸瓜找到柜子.假如 ...
- 让apache与mysql随着系统自动启动
让apache与mysql随着系统自动启动 在Linux中有一个文件/etc/rc.d/rc.local文件,其系统在启动时会自动加载该文件,我们可以把要启动的服务放入这个文件中即可. 添加以下代码:
- linux 线程函数大全
Technorati 标签: Linux thread 索引: 1.创建线程pthread_create 2.等待线程结束pthread_join 3.分离线程pthread_detach 4.创建线 ...
- ADO.NET笔记——SQL注入攻击
相关知识: 可以通过字符串的拼接来构造一个SQL命令字符串,但是SQL命令字符串的拼接确是造成“SQL注入攻击”的重要原因. 考虑下列例子:从ProductCategory表中检索出Name为“Bik ...
- MYSQL IN 与 EXISTS 的优化示例
文章转载自:http://www.jb51.net/article/53127.htm 当B表的数据集必须小于A表的数据集时,用in优于exists,当A表的数据集系小于B表的数据集时,用exists ...
- jQuery ID与Class性能对比之一
最近一直在做网站的优化方面的工作,在实际优化的过程中逐渐发现yahoo的34条只能作为一个大的方向,除此之外还有很多地方值得前端工程师关注的.结合最近的优化体会及实地测试,现发出来一部分供大家批评指正 ...
- oracle 文件导出
$ cat me.sqlset echo offset term offset line 1000 pages 0set feedback offset heading offset trimspoo ...
- 【PHP】phpcms html去除空白
// 文件路径:/phpcms/libs/classes/template_cache.class.php 42行 // 第四第五行是新增的 $content = $this->template ...