【贪心+优先队列 / 并查集】【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


  • 分析:

  • 贪心 + 优先队列

    1. 按时间排序工作。
    2. 当枚举到第i个工作时,如果时间足够,就直接完成;
      如果时间不够,则与前面完成的工作中报酬最少的比较,若该工作报酬更多,则替换它。
    3. 前面完成的工作中报酬最少的可以用c++中STL的优先队列维护→神犇的整理
  • 贪心 + 并查集
    1. 按报酬排序工作。
    2. 显然一个工作如果能完成,最优时就要设法最晚完成。
    3. 当枚举到一个工作,若截止时间>n,直接完成;
      否则,在尽可能晚的时间完成它。
    4. 用一个并查集,把时间分类,每类的根就是这类时间中空闲的最晚完成时间。

  • 代码:

  • 贪心 + 优先队列

#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
原创粉丝点击