ZOJ 3941 Kpop Music Party 贪心
题目链接:
http://www.icpc.moe/onlinejudge/showProblem.do?problemCode=3941
题解:
先吧所给的区间合并,得到若干个独立的区间。
然后从左到右把所有的区间都铺满个,并且对每个独立的区间的最后一个点考虑放和不放两种情况(dfs做,总复杂度也就2^10),然后去所有答案里面最大的那个。
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long LL; int n, k, m; struct Node {
LL l, r;
bool operator < (const Node& tmp) const {
return l < tmp.l || l == tmp.l&&r < tmp.r;
}
}arr[], nds[]; int tot; //pos表示当前已经覆盖到了pos-1的位置,从pos开始是还未覆盖的部分
void solve(LL pos, int cur, LL cnt, LL ret, LL &ans) {
if (cnt > m) return;
if (cur == tot || cnt == m) {
ans = max(ans, ret); return;
}
LL lef, len, sum;
if (pos <= nds[cur].r) {
lef = max(pos, nds[cur].l);
len = nds[cur].r - lef + ;
sum = len / k;
if (len%k) sum++;
if (cnt + sum>m) { ans = max(ans, ret + (m - cnt)*k); }
//最后一个点不放
solve(lef + k*sum, cur + , cnt + sum, ret + sum*k, ans);
//最后一个点放
solve(nds[cur].r + k, cur + , cnt + sum + , ret + nds[cur].r + k - lef, ans);
}
else {
//最后一个点不放
solve(pos, cur + , cnt, ret, ans);
//最后一个点放
solve(max(pos, nds[cur].r + k), cur + , cnt + , ret + max((LL), nds[cur].r + k - pos), ans);
}
} int main() {
int tc;
scanf("%d", &tc);
while (tc--) {
tot = ;
scanf("%d%d%d", &n, &k, &m);
for (int i = ; i < n; i++) {
scanf("%lld%lld", &arr[i].l, &arr[i].r);
}
sort(arr, arr + n);
//合并区间
for (int i = ; i < n; i++) {
if (tot == ) {
nds[tot++] = arr[i];
}
else {
if (arr[i].l <= nds[tot - ].r) {
nds[tot - ].r = max(nds[tot - ].r, arr[i].r);
}
else {
nds[tot++] = arr[i];
}
}
}
LL ans = ;
solve(, , , , ans);
printf("%lld\n", ans);
}
return ;
}
ZOJ 3941 Kpop Music Party 贪心的更多相关文章
- ZOJ 3941 Kpop Music Party(省赛, 贪心)
Kpop Music Party Time Limit: 2 Seconds Memory Limit: 65536 KB Marjar University often hosts Kpo ...
- ZOJ 3941 Kpop Music Party
先把能合并的区间都合并起来. 考虑最裸的贪心策略,从左到右一段一段的取. 但是,这样会有错,错在没有考虑每段区间选取最后一个点. 因为N只有10,所以枚举一下哪些区间最后一个点会被选择,然后按照最裸的 ...
- ZOJ 3699 Dakar Rally(贪心)
这是一道贪心题,他的贪心思想很容易想明白,我们保证油箱里的油始终是最便宜的我们最后的花费就能是最少的.实现方法就是:比如现在在i点,我们看邮箱满载能最远到达哪里,不妨设最远到达j,(j >= i ...
- ZOJ 2002 Copying Books 二分 贪心
传送门:Zoj2002 题目大意:从左到右把一排数字k分,得到最小化最大份,如果有多组解,左边的尽量小. 思路:贪心+二分(参考青蛙过河). 方向:从右向左. 注意:有可能最小化时不够k分.如 ...
- ZOJ 3607 Lazier Salesgirl(贪心)
题目:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3607 题意:一个卖面包的小姑娘,给第i个来买面包的人的价格是pi, ...
- ZOJ 2968 Difference Game 【贪心 + 二分】
题意: 有Ga.Gb两堆数字,初始时两堆数量相同.从一一堆中移一一个数字到另一一堆的花费定义为两堆之间数 量差的绝对值,初始时共有钱C.求移动后Ga的最小小值减Gb的最大大值可能的最大大值. 思路: ...
- ZOJ 3829 Known Notation(贪心)题解
题意:给一串字符,问你最少几步能变成后缀表达式.后缀表达式定义为,1 * 1 = 1 1 *,题目所给出的字串不带空格.你可以进行两种操作:加数字,交换任意两个字符. 思路:(不)显然,最终结果数字比 ...
- ZOJ - 3829 Known Notation(模拟+贪心)
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3829 给定一个字符串(只包含数字和星号)可以在字符串的任意位置添加一个数字 ...
- ZOJ - 3987 - Numbers (大数 + 贪心)
参考自:https://blog.csdn.net/u013534123/article/details/78484494 题意: 给出两个数字n,m,把n分成m份,使得以下最小 思路: 或运算只有0 ...
随机推荐
- IOS基础——alloc、init和new方法
alloc:分配内存. init:初始化. new:代替上面两个函数:分配内存,并且初始化. 注意: 1.在实际开发中很少会用到new,一般创建对象时我们一般是 [[className alloc]i ...
- scala学习笔记1
一.REPL scala解释器读到一个表达式,对它进行求值,将它的打印出来,接着再继续读下一个表达式.这个过程被称作 读取-打印-循环,即REPL. 从技术上讲,scala程序并不是一个解释器.实际发 ...
- 基于zookeeper的远程方法调用(RMI)的实现
采用zookeeper的命名服务,采用不同的目录结构存储不同模块不同服务的rmi的url,使用key来对应不同的服务.同时采用zookeeper解决了单点问题. 当有两个相同的服务注册时,因为采用的是 ...
- MongoDb 与 Nodejs服务器的启动
1) 启动MongoDB : MongoDB —dbpath databaseNameFolder. 2) 启动数据库 : Mongo DatabaseName. 3) 启动NodeJs: Node ...
- HUE 忘记密码
解决方法: 启动HUE的Shell /opt/cloudera/parcels/CDH/lib/hue/build/env/bin/hue shell from django.contrib.auth ...
- mysql 语句其它及优化
将检索到的数据保存到文件 Select * into outfile ‘文件地址’ from tabname; 生成的文件以制表符区分字段,以换行符区分记录 为满足特殊需求会采用不同的分割方式. 支 ...
- Yii中使用PHPExcel导出Excel
最近在研究PHP的Yii框架,很喜欢,碰到导出Excel的问题,研究了一下,就有了下面的方法: 1.首先在config/main.php中添加对PHPExcel的引用,我的方式是这样: // auto ...
- 18)Java八股文名词
>VO: value-object >DTO: Data Transform Object >DTD: Document Type Definition 文档类型定 ...
- IOS学习3
@property属性使用 copy:NSString strong: 一般对象 weak: UI空间 assign:基本数据类型 retain: (对象,先上述类型使用) id 万能指针. id缺点 ...
- asp.net中两款文本编辑器NicEdit和Kindeditor
过Web开发的朋友相信都使用过富文本编辑器,比较出名的CuteEditor和CKEditor很多人应该已经使用过,在功能强大的同时需要加载的东西也变得很多.下面要推荐的两款富文本编辑器都是使用JS编写 ...