题意:过年了,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]);

代码:

  1. #include <cstdio>
  2. #include <algorithm>
  3. #include <vector>
  4. #include <iostream>
  5. #include <cstring>
  6. #include <map>
  7. #include <set>
  8. #include <bitset>
  9. #include <queue>
  10. #include <cmath>
  11. #include <string>
  12. #define INF 0x3f3f3f3f3f3f3f3f
  13. #define pii pair<int, int>
  14. #define lowbit(x) (x & (-x))
  15. #define ls(x) (x << 1)
  16. #define rs(x) ((x << 1) | 1)
  17. #define LL long long
  18. using namespace std;
  19. const int maxn = 100010;
  20. struct node {
  21. int st, ed, d, pos;
  22. LL w;
  23. bool operator < (const node& rhs) const {
  24. if(w == rhs.w) return d < rhs.d;
  25. return w < rhs.w;
  26. }
  27. };
  28. node a[maxn];
  29. vector<int> b[maxn],c[maxn];
  30. priority_queue<node> q;
  31. LL dp[maxn][210];
  32. node re[maxn];
  33. bool v1[maxn];
  34. bool cmp(node x, node y) {
  35. if(x.st == y.st) return x.ed < y.ed;
  36. return x.st < y.st;
  37. }
  38. int main() {
  39. int n, k, m;
  40. scanf("%d%d%d", &n, &k ,&m);
  41. for (int i = 1; i <= m; i++) {
  42. scanf("%d%d%d%d", &a[i].st, &a[i].ed, &a[i].d, &a[i].w);
  43. }
  44. sort(a + 1, a + 1 + m);
  45. for (int i = 1; i <= m; i++) {
  46. b[a[i].st].push_back(i);
  47. c[a[i].ed].push_back(i);
  48. a[i].pos = i;
  49. }
  50. for (int i = 1; i <= n; i++) {
  51. for (int j = 0; j < b[i].size(); j++) {
  52. int y = b[i][j];
  53. q.push(a[y]);
  54. }
  55. while(q.size() && v1[q.top().pos]) {
  56. q.pop();
  57. }
  58. if(!q.empty())
  59. re[i] = q.top();
  60. else
  61. re[i] = (node) {0, 0, i, 0, 0};
  62. for (int j = 0; j < c[i].size(); j++) {
  63. int y = c[i][j];
  64. v1[y] = 1;
  65. }
  66. }
  67. memset(dp, 0x3f, sizeof(dp));
  68. dp[1][k] = 0;
  69. for (int i = 1; i <= n; i++) {
  70. for (int j = 0; j <= k; j++) {
  71. int d = re[i].d;
  72. if(j) dp[i + 1][j - 1] = min(dp[i + 1][j - 1], dp[i][j]);
  73. dp[d + 1][j] = min(dp[d + 1][j], dp[i][j] + re[i].w);
  74. }
  75. }
  76. LL ans = INF;
  77. for (int i = 0; i <= k; i++) {
  78. ans = min(ans, dp[n + 1][i]);
  79. }
  80. printf("%lld\n", ans);
  81. }

  

Codeforces #536 div2 E (1106E)Lunar New Year and Red Envelopes (DP)的更多相关文章

  1. 【Codeforces 1106E】 Lunar New Year and Red Envelopes

    Codeforces 1106 E 题意:有\(k\)个红包,第\(i\)个红包可以在\(s_i\)到\(t_i\)的时间内抢,同时获得\(w_i\)的钱,但是抢完以后一直到\(d_i\)都不可以继续 ...

  2. 【Codeforces 1106E】Lunar New Year and Red Envelopes

    [链接] 我是链接,点我呀:) [题意] 给你k个红包,每个红包可以在si..ti的时间范围内拿走. 抢完红包之后你得到wi元,然后你需要在di+1时刻才能继续抢红包 时间是线性的从1..n 然后某个 ...

  3. CF - 1106 E Lunar New Year and Red Envelopes DP

    题目传送门 题解: 首先要处理出每个时间点会选择哪一个线段. 对于这个问题,可以用multiset去维护信息. 当时间线开始的时候,往mutiset里面插入这个信息,当时间线结束的时候,删除这个信息. ...

  4. Codeforces 1106E. Lunar New Year and Red Envelopes(DP)

    E. Lunar New Year and Red Envelopes 题意: 在长度为n的时间轴上,有k个红包,每个红包有领取时间段[s,t],价值w,以及领了个这个红包之后,在时间d到来之前无法再 ...

  5. Codeforces I. Producing Snow(优先队列)

    题目描述: C. Producing Snow time limit per test 1 second memory limit per test 256 megabytes input stand ...

  6. Codeforces 1500F - Cupboards Jumps(set)

    Codeforces 题面传送门 & 洛谷题面传送门 nb tea!!!111 首先很显然的一件事是对于三个数 \(a,b,c\),其最大值与最小值的差就是三个数之间两两绝对值的较大值,即 \ ...

  7. 【CodeForces - 651C 】Watchmen(map)

    Watchmen 直接上中文 Descriptions: 钟表匠们的好基友马医生和蛋蛋现在要执行拯救表匠们的任务.在平面内一共有n个表匠,第i个表匠的位置为(xi, yi). 他们需要安排一个任务计划 ...

  8. [Codeforces 274E]:Mirror Room(模拟)

    题目传送门 题目描述 有一个$n\times m$的格子图,其中有一些是黑色的,另一些为白色.从某个白色格子的中心点向左上($NW$),左下($SW$),右上($NE$),右下($SE$)四个方向中的 ...

  9. 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 ...

随机推荐

  1. javascript给输入框赋值的一个误区

    一. 错误的示范 如下代码所示,如果需要用javascript获取id为username1, password1的输入框的值,将其写入id为username2, password2的输入框,那么红线区 ...

  2. 计算机网络【七】:可靠传输的实现 (tcp窗口滑动以及拥塞控制)【转】

    转自:http://blog.chinaunix.net/uid-26275986-id-4109679.html TCP协议作为一个可靠的面向流的传输协议,其可靠性和流量控制由滑动窗口协议保证,而拥 ...

  3. SpringBoot邮件发送功能

    快速入门 在Spring Boot的工程中的pom.xml中引入spring-boot-starter-mail依赖: <dependency> <groupId>org.sp ...

  4. hbase_异常_05_End of File Exception between local host is: "rayner/127.0.1.1"; destination host is: "localhost":9000;

    一.异常信息 java.io.EOFException: End of File Exception between local host is: "ubuntu/127.0.1.1&quo ...

  5. javascript.history.go();

    转自:http://www.mikebai.com/Article/2009-11/757.html <input type=button value=刷新 onclick="wind ...

  6. apache php配置 虚拟目录 和 虚拟主机 多域名配置 原理解析

    虚拟目录配置 就是说,我们放项目放在D盘,F盘,而不是默认的www文件夹下也可以访问.比如这里,我在 D:/PHP/work 放入的项目文件. 在httpd.conf加入: (位置一般是在 </ ...

  7. jquery ajax中使用jsonp的限制(转)

    http://www.cnblogs.com/dudu/archive/2012/12/04/jquery_ajax_jsonp.html jsonp 解决的是跨域 ajax 调用的问题.为什么要跨域 ...

  8. 2017 年比较 Angular、React、Vue 三剑客(转载)

    为 web 应用选择 JavaScript 开发框架是一件很费脑筋的事.现如今 Angular 和 React 非常流行,并且最近出现的新贵 VueJS 同样博得了很多人的关注.更重要的是,这只是一些 ...

  9. CERC2016 爵士之旅 Jazz Journey

    传送门(洛谷) 题目大意 给定$n$个位置,和一个长为$m$的序列$A$,你需要经过一条直接的边从第$A_i$个位置到第$A_{i+1}$个位置. 每条有向边$(u,v)$分为两种,第一种可以花费$C ...

  10. UVA - 242 Stamps and Envelope Size (完全背包+bitset)

    题意:给你一些邮票面值的集合,让你选择其中一个集合,使得“能用不超过n枚集合中的邮票凑成的面值集合S中从1开始的最大连续面值”(即mex(S)-1)最大.如果有多解,输出集合大小最小的一个:如果仍有多 ...