HDU-6437 Videos
题意:一天有n个小时,现在有m场电影,每场电影有一个愉悦值,有k个人,电影分2种类型A, B, 并且每一场电影只能一个人看, 一个人可以看无数次电影, 只要时间足够, 但是连续看同一种电影会减少愉悦值W点。现在要求所有人总的愉悦值加起来最大。
题解:
网络流建图,先把每个点拆成2个点, u 和 u‘ , 在u和u’中间连一条流量为1,费用为0的边, 现在我们规定 一个点的 复制点只能和本体链接, 只能由复制点往外流, 然后别的点流入只能留到本体。
也就是 假设 存在 u, v2个点, 这2个点之间可以存在边且为u->v 那么连线方式就为 u -> u' -> v -> v'。
因为每个电影看的人最多是1, 所以 u - > u' 的流量为1。
s -> s'的流量为k。
然后我们把s‘和所有的电影建边 流量为1, 花费为电影获得的愉悦值
然后把所有电影与t建边 流量为1,花费为0
然后我们把看完一场电影之后可以去看另一场电影的2个点建边,花费为下一次电影的愉悦值 - (是否为同一种类电影)* W。
由于是需要最大的愉悦值, 我们把花费取反, 然后跑费用流。 最后把答案取反。
代码:
#include<bits/stdc++.h>
using namespace std;
#define Fopen freopen("_in.txt","r",stdin); freopen("_out.txt","w",stdout);
#define LL long long
#define ULL unsigned LL
#define fi first
#define se second
#define pb push_back
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define max3(a,b,c) max(a,max(b,c))
#define min3(a,b,c) min(a,min(b,c)) typedef pair<int,int> pll;
const int INF = 0x3f3f3f3f;
const LL mod = (int)1e9+;
const int N = 1e5;
const int M = ;
int head[M], to[N], ct[N], w[N], nt[N];
int d[M], vis[M];
int pre[M], id[N];
int n, m, s, t, tot; void add(int u, int v, int val, int cost){
to[tot] = v;
ct[tot] = -cost;
w[tot] = val;
nt[tot] = head[u];
head[u] = tot++; to[tot] = u;
ct[tot] = cost;
w[tot] = ;
nt[tot] = head[v];
head[v] = tot++;
}
void init(){
memset(head,-,sizeof(head));
tot = ;
}
int spfa(){
queue<int> q;
memset(d, INF, sizeof(d));
memset(vis, , sizeof(vis));
memset(pre, -, sizeof(vis));
d[s] = ;
q.push(s);
while(!q.empty()){
int u = q.front(); q.pop();
vis[u] = ;
for(int i = head[u]; ~i; i = nt[i]){
if(w[i] > && d[to[i]] > d[u] + ct[i]){
d[to[i]] = d[u] + ct[i];
pre[to[i]] = u;
id[to[i]] = i;
if(!vis[to[i]]){
vis[to[i]] = ;
q.push(to[i]);
}
}
} }
return d[t] < INF;
} int MaxFlow(){
int Mi = INF;
int sum = ;
while(spfa()){
Mi = INF;
for(int i = t; i != s; i = pre[i])
Mi = min(Mi, w[id[i]]);
for(int i = t; i != s; i = pre[i]){
w[id[i]] -= Mi;
w[id[i]^] += Mi;
}
sum += d[t];
}
return sum;
}
struct Node{
int l, r, t, op;
bool operator < (const Node & x) const {
return l < x.l;
}
}A[N];
int main(){
int T, n, m, k, lost;
scanf("%d", &T);
while(T--){
scanf("%d%d%d%d", &n, &m, &k, &lost);
init();
for(int i = ; i <= m; i++)
scanf("%d%d%d%d", &A[i].l, &A[i].r, &A[i].t, &A[i].op);
sort(A+, A++m);
s = , t = * m+;
for(int i = ; i <= m; i++){
for(int j = i+; j <= m; j++){
if(A[i].r <= A[j].l){
add(m + i, j, , A[j].t - lost*(A[i].op == A[j].op));
}
}
}
add(s, * m + , k, );
for(int i = ; i <= m; i++){
add( * m + , i, , A[i].t);
add(i, m + i, , );
add(m + i, t, , );
}
printf("%d\n", -MaxFlow());
}
return ;
}
HDU-6437 Videos的更多相关文章
- HDU 6437 Problem L.Videos (最大费用)【费用流】
<题目链接> 题目大意: 一天有N个小时,有m个节目(每种节目都有类型),有k个人,连续看相同类型的节目会扣w快乐值.每一种节目有都一个播放区间[l,r].每个人同一时间只能看一个节目,看 ...
- HDU - 6437:Videos (裸的费用流)
...懒得说什么了 #include<bits/stdc++.h> using namespace std; ; <<;int To[maxn],Laxt[maxn],Next ...
- HDU - 6437 Problem L.Videos 2018 Multi-University Training Contest 10 (最小费用最大流)
题意:M个影片,其属性有开始时间S,结束时间T,类型op和权值val.有K个人,每个人可以看若干个时间不相交的影片,其获得的收益是这个影片的权值val,但如果观看的影片相邻为相同的属性,那么收益要减少 ...
- HDU 6437 最(大) 小费用最大流
Problem L.Videos Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 524288/524288 K (Java/Other ...
- hdu 6437 /// 最小费用最大流 负花费 SPFA模板
题目大意: 给定n,m,K,W 表示n个小时 m场电影(分为类型A.B) K个人 若某个人连续看了两场相同类型的电影则失去W 电影时间不能重叠 接下来给定m场电影的 s t w op 表示电影的 开始 ...
- 【杂题总汇】HDU多校赛第十场 Videos
[HDU2018多校赛第十场]Videos 最后一场比赛也结束了…… +HDU传送门+ ◇ 题目 <简要翻译> 有n个人以及m部电影,每个人都有一个快乐值.每场电影都有它的开始.结束时间和 ...
- HDOJ 2111. Saving HDU 贪心 结构体排序
Saving HDU Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- 【HDU 3037】Saving Beans Lucas定理模板
http://acm.hdu.edu.cn/showproblem.php?pid=3037 Lucas定理模板. 现在才写,noip滚粗前兆QAQ #include<cstdio> #i ...
- hdu 4859 海岸线 Bestcoder Round 1
http://acm.hdu.edu.cn/showproblem.php?pid=4859 题目大意: 在一个矩形周围都是海,这个矩形中有陆地,深海和浅海.浅海是可以填成陆地的. 求最多有多少条方格 ...
- HDU 4569 Special equations(取模)
Special equations Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u S ...
随机推荐
- 【Spring】No converter found for return value of type: class java.util.ArrayList
错误信息: org.springframework.http.converter.HttpMessageNotWritableException: No converter found for ret ...
- 【Java】字符串空格相关
1. 去掉首尾空格 [trim() 方法] String.trim() //去掉首尾空格 2. 替换多个空格为一个 [replaceAll() 方法] str.replaceAll(" + ...
- 【未解决】iOS QBImagePickerController访问相册没有取消和确定按钮
这两天调程序时遇到了这个问题,如图所示: 感觉这问题也是奇葩………… 用系统的 UIImagePickerController 替换后就正常了.看来是 QBImagePickerController ...
- 使用log4net记录ABP日志
demo地址:ABP.WindowsService 该文章是系列文章 基于.NetCore和ABP框架如何让Windows服务执行Quartz定时作业 的其中一篇. 参考:https://aspnet ...
- Something wrong with EnCase v8 index search results
My friend told me that she installed EnCase v8.05 on her workstation which OS version is Win 10. She ...
- 前端面试 js 你有多了解call,apply,bind?
函数原型链中的 apply,call 和 bind 方法是 JavaScript 中相当重要的概念,与 this 关键字密切相关,相当一部分人对它们的理解还是比较浅显,所谓js基础扎实,绕不开这些基础 ...
- c#小灶——注释和代码规范
为什么要写注释? 早上我写完了代码,我和我的朋友们都能看懂,到了晚上,我还能看懂,一周后,就只有上帝能看懂了…… 将来我们写的代码量是很大的,代码又不像我们自然语言这么好理解,可能过段时间我们就不认识 ...
- Android:JNI与NDK(三)NDK构建的脚本文件配置
友情提示:欢迎关注本人公众号,那里有更好的阅读体验以及第一时间获取最新文章 本文目录 一.前言 本篇我们介绍Android.mk与CMakeLists.txt构建NDK的配置文件,我们知道目前NDK的 ...
- 2019牛客多校训练第三场H.Magic Line(思维)
题目传送门 大致题意: 输入测试用例个数T,输入点的个数n(n为偶数),再分别输入n个不同的点的坐标,要求输出四个整数x1,y1,x2,y2,表示有一条经过点(x1,y1),(x2,y2)的直线将该二 ...
- 我的mybatis入门宝典
**********************************************************************************************一:myba ...