Vijos1891 学姐的逛街计划


描述

doc 最近太忙了, 每天都有课. 这不怕, doc 可以请假不去上课.

偏偏学校又有规定, 任意连续 n 天中, 不得请假超过 k 天.

doc 很忧伤, 因为他还要陪学姐去逛街呢.

后来, doc发现, 如果自己哪一天智商更高一些, 陪学姐逛街会得到更多的好感度.

现在 doc 决定做一个实验来验证自己的猜想, 他拜托 小岛 预测出了 自己 未来 3n 天中, 每一天的智商.

doc 希望在之后的 3n 天中选出一些日子来陪学姐逛街, 要求在不违反校规的情况下, 陪学姐逛街的日子自己智商的总和最大.

可是, 究竟这个和最大能是多少呢?

格式

输入格式

第一行给出两个整数, n 和 k, 表示我们需要设计之后 3n 天的逛街计划, 且任意连续 n 天中不能请假超过 k 天.

第二行给出 3n 个整数, 依次表示 doc 每一天的智商有多少. 所有数据均为64位无符号整数

输出格式

输出只有一个整数, 表示可以取到的最大智商和.

样例1

样例输入1

5 3

14 21 9 30 11 8 1 20 29 23 17 27 7 8 35

样例输出1

195

限制

对于 20% 的数据, 1 <= n <= 12 , k = 3.

对于 70% 的数据, 1 <= n <= 40 .

对于 100% 的数据, 1 <= n <= 200 , 1 <= k <= 10.


将每个点拆成i和i’,从S向SS连容量为k费用为0的边,SS向每个点i连容量为1费用为0的边,每个i向i’连容量为1费用为价值的边,每个i’向T连容量为1费用为0的边,i’向[i+n,i+n*3]中的所有点连容量为1费用为0的边,跑最大费用流。

                                 " role="presentation">                                                                  —by Milky Way


#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=2010;
const LL INF=1e18;
LL read(){
LL ans=0,w=1;char c=getchar();
while(!isdigit(c)&&c!='-')c=getchar();
if(c=='-')c=getchar(),w=-1;
while(isdigit(c))ans=ans*10+c-'0',c=getchar();
return ans*w;
}
struct Edge{
int from,to;
LL flow,cap,cost;
}E[N*N>>2];
vector<int> G[N];
int S,SS,T,n,tot=0,p[N];
LL d[N],f[N];
bool inq[N];
void add(int from,int to,LL cap,LL cost){
E[tot]=(Edge){from,to,0,cap,cost};
G[from].push_back(tot++);
E[tot]=(Edge){to,from,0,0,-cost};
G[to].push_back(tot++);
}
bool SPFA(LL &flow,LL &cost){
memset(inq,0,sizeof(inq));
queue<int> q;q.push(S);
inq[S]=1;
for(int i=1;i<=T;i++)d[i]=INF;
d[S]=p[S]=0,f[S]=INF;
while(!q.empty()){
int x=q.front();q.pop();inq[x]=0;
for(int i=0;i<G[x].size();i++){
Edge e=E[G[x][i]];
if(e.cap>e.flow&&d[e.to]>d[x]+e.cost){
d[e .to]=d[x]+e.cost;
p[e.to]=G[x][i];//记录经过哪条边
f[e.to]=min(f[x],e.cap-e.flow);
if(!inq[e.to])q.push(e.to),inq[e.to]=1;
}
}
}
if(d[T]==INF)return false;
flow+=f[T],cost+=f[T]*d[T];
int x=T;
while(x!=S){
E[p[x]].flow+=f[T];
E[p[x]^1].flow-=f[T];
x=E[p[x]].from;
}
return true;
}
LL mincost(){
LL flow=0,cost=0;
while(SPFA(flow,cost)){}
return cost;
}
int main(){
n=read();int k=read();
S=0,SS=n*6+1,T=SS+1;
add(S,SS,k,0);
for(int i=1;i<=n*3;i++){
int x=read();
add(SS,i,1,0);
add(i,i+n*3,1,-x);
add(i+n*3,T,1,0);
for(int j=i+n;j<=n*3;j++)
add(i+n*3,j,1,0);
}
printf("%lld\n",-mincost());
return 0;
}

Vijos1891 学姐的逛街计划 【费用流】*的更多相关文章

  1. vijos1891 学姐的逛街计划(线性规划)

    P1891学姐的逛街计划 描述 doc 最近太忙了, 每天都有课. 这不怕, doc 可以请假不去上课.偏偏学校又有规定, 任意连续 n 天中, 不得请假超过 k 天. doc 很忧伤, 因为他还要陪 ...

  2. [vijos1891]学姐的逛街计划

                                                                     学姐的逛街计划 描述 doc 最近太忙了, 每天都有课. 这不怕, d ...

  3. 刷题总结——学姐的逛街计划(vijos1891费用流)

    题目: doc 最近太忙了, 每天都有课. 这不怕, doc 可以请假不去上课.偏偏学校又有规定, 任意连续 n 天中, 不得请假超过 k 天. doc 很忧伤, 因为他还要陪学姐去逛街呢. 后来, ...

  4. Vijos 学姐的逛街计划

    传送门 题解传送门 线性规划,最小费用最大流. 神奇的操作. //Achen #include<algorithm> #include<iostream> #include&l ...

  5. [2019多校联考(Round 6 T3)]脱单计划 (费用流)

    [2019多校联考(Round 6 T3)]脱单计划 (费用流) 题面 你是一家相亲机构的策划总监,在一次相亲活动中,有 n 个小区的若干男士和 n个小区的若干女士报名了这次活动,你需要将这些参与者两 ...

  6. hdu 6118度度熊的交易计划(费用流)

    度度熊的交易计划 Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total S ...

  7. loj 6008 餐巾计划 - 费用流

    题目传送门 传送门 题目大意 (经典题还不知道题意?) 容易想到需要把未使用的餐巾和已经使用的餐巾分开. 设$X_i$表示第$i$天已经的使用餐巾的点,设$Y_i$表示第$i$天还未使用的餐巾的点 我 ...

  8. CF 277E Binary Tree on Plane (拆点 + 费用流) (KM也可做)

    题目大意: 平面上有n个点,两两不同.现在给出二叉树的定义,要求树边一定是从上指向下,即从y坐标大的点指向小的点,并且每个结点至多有两个儿子.现在让你求给出的这些点是否能构成一棵二叉树,如果能,使二叉 ...

  9. Vijos1901 学姐的钱包

    描述 学姐每次出门逛街都要带恰好M元钱, 不过她今天却忘记带钱包了.可怜的doc只好自己凑钱给学姐, 但是他口袋里只有一元钱.好在doc的N位朋友们都特别有钱, 他们答应与doc作一些交换.其中第i位 ...

随机推荐

  1. nagios监控3306端口

    1.修改 /usr/local/nagios/etc/objects/commands.cfg  添加一个服务名 # check port define command{ command_name c ...

  2. harbor 管理Helm Chart包

    官方网站:https://github.com/goharbor/harbor官方用户手册:https://github.com/goharbor/harbor/blob/master/docs/us ...

  3. Asp.net WebApi 配置 Swagger UI

    首先安装Swashbuckle.Core 然后添加swagger配置文件. [assembly: PreApplicationStartMethod(typeof(SwaggerConfig), &q ...

  4. 使用js合并table中的单元格

    用primefaces做的报表,领导要求合并相同内容的单元格,但是primefaces没有找到可以合并单元格的组件,想来想去,只有页面加载后用js合并了. http://blog.csdn.net/d ...

  5. Qwt中鼠标获取坐标点

    void getPoint(QwtPlot *plot) { QPoint point = plot->canvas()->mapFromGlobal(QCursor::pos()); Q ...

  6. poi读取excel转对象,格式转换帮助类

    //格式转换//value:原数据,parmtype:方法参数类型,cellType 单元格类型public static Object formatd(String value, String pa ...

  7. Codeforces Round #349 (Div. 2)

    第一题直接算就行了为了追求手速忘了输出yes导致wa了一发... 第二题技巧题,直接sort,然后把最大的和其他的相减就是构成一条直线,为了满足条件就+1 #include<map> #i ...

  8. HTTP下载图片

    网上有专门写的http下载的C++代码,但是我发现windows自带的http下载,一行代码就搞定,非常简单,目前为止使用正常. 首先包含头文件和lib文件 #include <urlmon.h ...

  9. leetcode 427. Construct Quad Tree

    We want to use quad trees to store an N x N boolean grid. Each cell in the grid can only be true or ...

  10. Django 中设置分页页码,只显示当前页以及左右两页

    设置后的效果如下: Django 给我们提供了分页的功能:`Paginator`和`Page`类都是用来做分页的.他们在Django中的路径为:`from django.core.paginator ...