安吉D8-C
- 1安吉D19 T1
- 2安吉D19 T3
- 3安吉D20 模考12总结
- 4安吉D17 T3
- 5安吉D17 T4
- 6安吉D19 模考11总结
- 7安吉D15 A
- 8安吉D16 T4
- 9安吉D17 T1
- 10安吉D17 模考10总结
- 11安吉D16 T3
- 12安吉D16 模考9总结
- 13安吉D13 模考8总结
- 14安吉D13-T2
- 15安吉D13-T3
- 16安吉D12-T3
- 17安吉D11-B
- 18安吉D11-C
- 19安吉D11-D
- 20安吉D12 模考7总结
- 21安吉D12-T2
- 22安吉D11-A
- 23安吉D10 模考6总结
- 24安吉D10-T3
- 25安吉D10-T4
- 26安吉D8-E
- 27安吉D9-T4
- 28安吉D8-A
- 29安吉D8-B
- 30安吉D8-C本文
- 31安吉D8-D
- 32安吉D9 模考5总结
- 33安吉D9-T2
- 34安吉D9-T3
- 35安吉D6-T4
- 36安吉D4-G
- 37安吉D5-T2
- 38安吉D6 模考4总结
- 39安吉D6-T1
- 40安吉D6-T3
- 41安吉-开营测试 T4
- 42安吉D5 模考3总结
- 43安吉D5-T3
- 44安吉D4-A
- 45安吉D4-B
- 46安吉D4-C
- 47安吉D4:容斥原理
- 48安吉Day4-D
- 49安吉D3 模考2总结
- 50安吉D3-T1
- 51安吉D3-T2
- 52安吉D3-T4
- 53安吉D2 模考1总结
- 54安吉D2-T2
- 55安吉D1-G
- 56安吉D1-L
- 57安吉D2-T4
原题呈现
P12247 跳舞机
题目描述
小 O 想要经营电 van 城,跳舞机的运营非常重要.
小 O 的电 van 城有一台跳舞机,跳舞机在同一时间至多有一名玩家游玩,每局游戏需要完整且连续地游玩 分钟.
电 van 城将营业 分钟.期间有 名玩家想要游玩跳舞机,编号 .编号为 的玩家会在营业的第 分钟到第 分钟(包括 和 )待在电 van 城,在此期间可以游玩任意局跳舞机.并且,每游玩一局,会产生 的兴奋值.注意,如果玩家 要玩一局跳舞机,则每局游戏的 分钟必须完全包含于玩家的停留时间 .
小 O 想要最大化所有玩家的兴奋值之和,请你帮他求出最大的兴奋值之和.
输入格式
输入共 行.
第一行输入三个整数 ,分别表示玩家个数、营业时间、游玩一局跳舞机需要的时间.
第 行,第 行有三个整数 ,表示编号为 的玩家的停留时间和游玩一局产生的兴奋值.
输出格式
输出共一行一个整数,表示最大的兴奋值之和.
输入输出样例 #1
输入 #1
3 6 21 5 15 6 25 6 3输出 #1
5输入输出样例 #2
输入 #2
4 7 31 7 12 5 44 7 51 2 10输出 #2
9说明/提示
样例 #1 解释
可以让编号为 的玩家在第 分钟、第 分钟玩一局跳舞机,编号为 的玩家在第 分钟玩一局.兴奋值的总和为 ,可以发现没有让兴奋值总和更大的方案.
样例 #2 解释
可以让编号为 的玩家在第 分钟玩一局跳舞机,编号为 的玩家在第 分钟玩一局.兴奋值的总和为 ,可以发现没有让兴奋值总和更大的方案.
数据范围
对于所有数据,满足:
- ;
- ;
- ;
- .
设 ,则具体测试点限制如下:
| 测试点编号 | 的范围 | 的范围 | 特殊性质 |
|---|---|---|---|
| 无 | |||
| 无 | |||
| 无 | |||
| 无 |
此题使用 dp.
定义状态 dp[i] 表示到第 分钟结束时的最大收益.(这样定义状态的方法叫做依照问题法.在实践中,我们可以依照题目所求的内容来制定状态)
不难发现初始状态:
dp[0] = 0;由于此题推进时间或赢得分数的途径只有:
- 让一个人玩跳舞机
- 让跳舞机闲置
,因此不难发现转移方程:
这个转移方程是 的,如何优化?
将转移方程变形为:
加下来,只需要算出:
即可.
由于 在枚举时是递增的,所以可以使用优先队列优化.使用一个优先队列,其中储存所有可能在当前时刻恰好结束一局跳舞机的玩家(即呆在电玩城中的时间大于等于 ).
将所有的玩家按照来的顺序排序.每当遍历到时刻 时,将所有第 这个时刻进入电玩城的玩家加入优先队列,这些玩家有可能在第 秒结束时正好结束一局跳舞机(从第 到第 秒).
然后,在优先队列中获取 最高的一名玩家,如果该玩家已经离开电玩城了(即 ),那么将该玩家从优先队列中删去,重新选取一名 最高的玩家.让该玩家在 到 这一段时间里游玩跳舞机.这名玩家的 就是上面需要算出的 .
标程
#include <bits/stdc++.h>using namespace std;typedef long long ll;const int N = 5e5 + 100;struct People { int l, r, w; friend bool operator<(const People a, const People b) { return a.w < b.w; }} a[N];
priority_queue<People> pq;int n, m, k;ll f[N];
signed main() { cin >> n >> m >> k; for (int i = 1; i <= n; i++) { cin >> a[i].l >> a[i].r >> a[i].w; } sort(a + 1, a + n + 1, [](const People a, const People b) { return a.l < b.l; }); int ptr = 0; for (int i = 1; i <= m; i++) { while (ptr != n && a[ptr + 1].l <= i - k + 1) { pq.push(a[++ptr]); } f[i] = f[i - 1]; while (!pq.empty()) { People top = pq.top(); if (top.r < i) { pq.pop(); continue; } f[i] = max(f[i], f[i - k] + top.w); break; } } cout << f[m]; return 0;}文章分享
如果这篇文章对你有帮助,欢迎分享给更多人!


