Codeforces #536 div2 E (1106E)Lunar New Year and Red Envelopes (DP)
题意:过年了,Bob要抢红包。抢红包的时间段为1 - n,有m个红包,每个红包有三个属性:st(红包出现的时间), ed(红包消失的时间),d(如果抢了这个红包,能够抢下一个红包的时间),w(红包的收益)。注:结束时间为ed是指在ed + 1的时候才能抢其它的红包,d同理。Bob是一个贪心的人,如果当前时间段他可以抢红包,他会抢现在出现的红包中收益最大的红包。如果有多个收益最大的红包,他会抢d最大的那个。Alice可以打断Bob k次,每次打断可以使Bob在1秒内无法行动,下一秒恢复正常。现在问Bob可以获得的最小的收益是多少?
思路:这种题一看就知道常规方法解决不了啦,只能DP了。首先,每个时间点抢的是什么红包其实是固定的,我们只需要先把红包按开始时间排序,然后用堆或者mutiset维护这个时间点抢什么。其次,我们可以发现,如果Bob抢了某个红包,他只有在特定的时间之后才能抢下一个红包,这是明显的状态转移过程。我们设dp[i][j]为处于时间点i,还可以打扰j次的最小收益。那么我们可以执行两种转移:
1:我们抢这个红包,(设这个红包的w为wi,d为di)那么dp[di + 1][j ] = min(dp[di + 1][j], dp[i][j] + wi)
2:现在不抢,用掉一次打扰机会,那么dp[i + 1][j - 1] = min(dp[i + 1][j - 1], dp[i][j]);
代码:
#include <cstdio>
#include <algorithm>
#include <vector>
#include <iostream>
#include <cstring>
#include <map>
#include <set>
#include <bitset>
#include <queue>
#include <cmath>
#include <string>
#define INF 0x3f3f3f3f3f3f3f3f
#define pii pair<int, int>
#define lowbit(x) (x & (-x))
#define ls(x) (x << 1)
#define rs(x) ((x << 1) | 1)
#define LL long long
using namespace std;
const int maxn = 100010;
struct node {
int st, ed, d, pos;
LL w;
bool operator < (const node& rhs) const {
if(w == rhs.w) return d < rhs.d;
return w < rhs.w;
}
};
node a[maxn];
vector<int> b[maxn],c[maxn];
priority_queue<node> q;
LL dp[maxn][210];
node re[maxn];
bool v1[maxn];
bool cmp(node x, node y) {
if(x.st == y.st) return x.ed < y.ed;
return x.st < y.st;
}
int main() {
int n, k, m;
scanf("%d%d%d", &n, &k ,&m);
for (int i = 1; i <= m; i++) {
scanf("%d%d%d%d", &a[i].st, &a[i].ed, &a[i].d, &a[i].w);
}
sort(a + 1, a + 1 + m);
for (int i = 1; i <= m; i++) {
b[a[i].st].push_back(i);
c[a[i].ed].push_back(i);
a[i].pos = i;
}
for (int i = 1; i <= n; i++) {
for (int j = 0; j < b[i].size(); j++) {
int y = b[i][j];
q.push(a[y]);
}
while(q.size() && v1[q.top().pos]) {
q.pop();
}
if(!q.empty())
re[i] = q.top();
else
re[i] = (node) {0, 0, i, 0, 0};
for (int j = 0; j < c[i].size(); j++) {
int y = c[i][j];
v1[y] = 1;
}
}
memset(dp, 0x3f, sizeof(dp));
dp[1][k] = 0;
for (int i = 1; i <= n; i++) {
for (int j = 0; j <= k; j++) {
int d = re[i].d;
if(j) dp[i + 1][j - 1] = min(dp[i + 1][j - 1], dp[i][j]);
dp[d + 1][j] = min(dp[d + 1][j], dp[i][j] + re[i].w);
}
}
LL ans = INF;
for (int i = 0; i <= k; i++) {
ans = min(ans, dp[n + 1][i]);
}
printf("%lld\n", ans);
}
Codeforces #536 div2 E (1106E)Lunar New Year and Red Envelopes (DP)的更多相关文章
- 【Codeforces 1106E】 Lunar New Year and Red Envelopes
Codeforces 1106 E 题意:有\(k\)个红包,第\(i\)个红包可以在\(s_i\)到\(t_i\)的时间内抢,同时获得\(w_i\)的钱,但是抢完以后一直到\(d_i\)都不可以继续 ...
- 【Codeforces 1106E】Lunar New Year and Red Envelopes
[链接] 我是链接,点我呀:) [题意] 给你k个红包,每个红包可以在si..ti的时间范围内拿走. 抢完红包之后你得到wi元,然后你需要在di+1时刻才能继续抢红包 时间是线性的从1..n 然后某个 ...
- CF - 1106 E Lunar New Year and Red Envelopes DP
题目传送门 题解: 首先要处理出每个时间点会选择哪一个线段. 对于这个问题,可以用multiset去维护信息. 当时间线开始的时候,往mutiset里面插入这个信息,当时间线结束的时候,删除这个信息. ...
- Codeforces 1106E. Lunar New Year and Red Envelopes(DP)
E. Lunar New Year and Red Envelopes 题意: 在长度为n的时间轴上,有k个红包,每个红包有领取时间段[s,t],价值w,以及领了个这个红包之后,在时间d到来之前无法再 ...
- Codeforces I. Producing Snow(优先队列)
题目描述: C. Producing Snow time limit per test 1 second memory limit per test 256 megabytes input stand ...
- Codeforces 1500F - Cupboards Jumps(set)
Codeforces 题面传送门 & 洛谷题面传送门 nb tea!!!111 首先很显然的一件事是对于三个数 \(a,b,c\),其最大值与最小值的差就是三个数之间两两绝对值的较大值,即 \ ...
- 【CodeForces - 651C 】Watchmen(map)
Watchmen 直接上中文 Descriptions: 钟表匠们的好基友马医生和蛋蛋现在要执行拯救表匠们的任务.在平面内一共有n个表匠,第i个表匠的位置为(xi, yi). 他们需要安排一个任务计划 ...
- [Codeforces 274E]:Mirror Room(模拟)
题目传送门 题目描述 有一个$n\times m$的格子图,其中有一些是黑色的,另一些为白色.从某个白色格子的中心点向左上($NW$),左下($SW$),右上($NE$),右下($SE$)四个方向中的 ...
- CodeForces - 1162E Thanos Nim (博弈论)
Alice and Bob are playing a game with nn piles of stones. It is guaranteed that nn is an even number ...
随机推荐
- cassandra——可以预料的查询,如果你的查询条件有一个是根据索引查询,那其它非索引非主键字段,可以通过加一个ALLOW FILTERING来过滤实现
cassandra的索引查询和排序 转自:http://zhaoyanblog.com/archives/499.html cassandra的索引查询和排序 cassandra的查询虽然很弱,但 ...
- maven笔记(maven使用与安装,eclipse中maven的配置,maven项目的创建)
一.初识maven 1.maven是什么? 他是一个项目管理器,配置好pom配置文件后,maven会管理项目的依赖文件等,当项目用到外部jar包时,maven帮助我们去网上下载并打包发到Tomcat中 ...
- BZOJ5334: [Tjoi2018]数学计算
BZOJ5334: [Tjoi2018]数学计算 https://lydsy.com/JudgeOnline/problem.php?id=5334 分析: 线段树按时间分治即可. 代码: #incl ...
- swing之复杂登陆界面的实现
package jiemian; import gonggong.message; import gonggong.messageType; import gonggong.user; import ...
- Rabbitmq用户权限配置
由于账号guest具有所有的操作权限,并且又是默认账号,出于安全因素的考虑,guest用户只能通过localhost登陆使用,并建议修改guest用户的密码以及新建其他账号管理使用rabbitmq(该 ...
- 月薪3万Java程序员要达到的技术层次
要达到月薪3万,一般要在北上广深杭知名的互联网公司,同时要在某一个知识领域达到专家级别,而不是简单的掌握SSH那么简单.虽然对部分人有点难,但目标还是要有的,万一实现呢? 首先三万的月薪在BAT实在太 ...
- Java编程思想第七章复用类
7.1组合语法 在一个类中引入多个对象,以提高代码的复用性与功能. 7.2继承语法 使用继承子类可以获得,导出类可以获得基类的成员(变量与方法). 注:这里注意权限控制,若基类中的成员为默认权限,只有 ...
- Azure VM从ASM迁移到ARM(一)
Azure的IaaS有ASM和ARM两个版本,ARM的一些优点前面已经聊过很多了.ARM有更细的管理颗粒度,更多的功能等. 如果想从ASM迁移到ARM,目前有两类方法可以实现: 1. Azure平台支 ...
- svn-clearup 报错的处理(Cleanup failed to process the following paths...)
在使用 svn 客户端执行操作失败后,执行 Clean up 操作也报错:Cleanup failed to process the following paths... ,一直不知道是什么原因.通常 ...
- HTML5离线应用
本地缓存与浏览器缓存 本地缓存是为整个web应用程序服务的而网页缓存值服务与单个网页 本地缓存是为你指定的资源进行缓存,而我们不知道网页缓存会春初哪些内容,他是不安全不可靠的 在没有网络的时候还是可以 ...