【贪心+优先队列 / 并查集】【cofun1025】工作安排
来源:互联网 发布:交通枢纽大数据 编辑:程序博客网 时间:2024/05/21 17:37
【cofun1025】工作安排
Description
为了让农场有效运转,约翰必须靠自己工作来赚钱。他接到了N项任务,完成每项任务 都要花费一个单位的时间。第i项任务的截止时间为Di,如果能按时完成,可以得到报酬Pi。 约翰从0时刻开始工作,由于他在同一个时间内只能从事一项任务,所以他很难按时完成所 有任务。请帮助约翰计算一下,他最多可以赚多少钱?
Input Format
第一行:单个整数:N,1 ≤ N ≤ 10^5 第二行到N + 1行:在第i + 1行有两个用空格分开的整数:Di和Pi,1 ≤ Di, Pi ≤ 10^9
Output Format
第一行:单个整数,表示约翰可赚得的最多钱
Sample Input
3
2 10
1 5
1 7
Sample Output
17
Hint
先做第三个任务,再做第一个任务
Source
USACO 2009 Open
分析:
贪心 + 优先队列
- 按时间排序工作。
- 当枚举到第i个工作时,如果时间足够,就直接完成;
如果时间不够,则与前面完成的工作中报酬最少的比较,若该工作报酬更多,则替换它。 - 前面完成的工作中报酬最少的可以用c++中STL的优先队列维护→神犇的整理
- 贪心 + 并查集
- 按报酬排序工作。
- 显然一个工作如果能完成,最优时就要设法最晚完成。
- 当枚举到一个工作,若截止时间>n,直接完成;
否则,在尽可能晚的时间完成它。 - 用一个并查集,把时间分类,每类的根就是这类时间中空闲的最晚完成时间。
代码:
贪心 + 优先队列
#include <bits/stdc++.h> using namespace std; struct info{ int d, p; }a[100005]; int n, i, j; long long ans; priority_queue<int, vector<int>, greater<int> >q; bool cmp(info x, info y) { return x.d < y.d || (x.d == y.d && x.p > y.p); } int main() { scanf("%d", &n); for(i = 1; i <= n; i ++) scanf("%d%d", &a[i].d, &a[i].p); sort(a + 1, a + n + 1, cmp); for(i = 1; i <= n; i ++) if (q.size() < a[i].d) ans += a[i].p, q.push(a[i].p); else if (a[i].p > q.top()) { ans += a[i].p - q.top(); q.pop(); q.push(a[i].p); } printf("%lld", ans); return 0; }
- 贪心 + 并查集
#include<bits/stdc++.h> using namespace std; typedef long long ll; struct info{ ll d, p; }a[100005]; ll n, i, j, p[100005], ans; bool cmp(info a, info b) { return a.p > b.p; } inline ll find(ll x) { return p[x] == x ? x : p[x] = find(p[x]); } int main() { scanf("%lld", &n); for(i = 1; i <= n; i ++) scanf("%lld%lld", &a[i].d, &a[i].p), p[i] = i; sort(a + 1, a + n + 1, cmp); for(i = 1; i <= n; i ++) if (a[i].d > n) ans += a[i].p; else { j = find(a[i].d); if (! j) continue; ans += a[i].p; p[j] = j - 1; } printf("%lld", ans); return 0; }
研究概率~Fighting!完成计划!!
阅读全文
0 0
- 【贪心+优先队列 / 并查集】【cofun1025】工作安排
- HDU 6136 贪心+优先队列+并查集优化
- poj 1456 Supermarket(贪心+并查集,贪心+优先队列)
- 51nod 1163 最高的奖励 (贪心+优先队列/并查集)&& 1191 消灭兔子(贪心+优先队列维护) && 1475 建设国家 (思维枚举+优先队列)
- [POJ 1456]Supermarket[贪心][优先队列or并查集优化]
- poj Supermarket(贪心)(并查集)(优先队列)
- 51nod 1428 活动安排问题 优先队列+贪心
- 贪心+优先队列-51nod-1428 活动安排问题
- 51Nod 1428 活动安排问题 贪心+优先队列
- 51Nod 1428 活动安排问题 贪心+优先队列
- 51Nod 1163 最高的奖励(贪心+优先队列/并查集合)
- POJ 1251 kruskal+优先队列+并查集
- POJ 1861 kruskal+优先队列+并查集
- HDU 5361 In Touch (优先队列+并查集优化)
- 玲珑学院OJ 1072 Capture【并查集+优先队列】
- D. Swaps in Permutation【并查集+优先队列】
- 贪心+并查集
- 贪心+并查集
- 柱形图中求最大四边形面积
- NOIp2016 题解
- 逃离焦油坑的伟大尝试——《人月神话》推荐
- 定义函数
- 机器学习应用——sklearn自带数据集训练(支持向量机分类)
- 【贪心+优先队列 / 并查集】【cofun1025】工作安排
- sqlmap 简单操作与数据库账户密码破解
- 寻找单链表的倒数第四个节点
- HDU
- JSTL(第二节)
- WampSever 64 虚拟站点的构建
- hdu 4436 后缀自动机算和
- 经典算法题1:找出数组中只出现一次的数字,其它数字都出现了两次
- leetcode解题方案--016--3 sum closest