首页 > 代码库 > bzoj1572 [Usaco2009 Open]工作安排Job

bzoj1572 [Usaco2009 Open]工作安排Job

传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1572

【题解】

这么傻逼的题会想错啊。。。

想到用优先队列维护了但是维护的方向想错了。

按时间排序

用优先队列维护当前p最大的当前时间个。

然后加入 如果不满就加,否则选一个扔掉。最后统计队列中的即可。

技术分享
# include <queue>
# include <stdio.h>
# include <string.h>
# include <iostream>
# include <algorithm>
// # include <bits/stdc++.h>

using namespace std;

typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
const int M = 5e5 + 10;
const int mod = 1e9+7;

# define RG register
# define ST static

int n;
struct pa {
    int d, p;
    pa () {}
    pa (int d, int p) : d(d), p(p) {}
    friend bool operator < (pa a, pa b) {
        return a.p > b.p || (a.p == b.p && a.d < b.d);
    }
}p[M];

priority_queue<pa> q;

inline bool cmp(pa a, pa b) {
    return a.d < b.d;
}


int main() {
    cin >> n;
    for (int i=1; i<=n; ++i) scanf("%d%d", &p[i].d, &p[i].p);
    sort(p+1, p+n+1, cmp);
    for (int i=1; i<=n; ++i) {
        if(q.size() < p[i].d) q.push(p[i]);
        else if(p[i].p > q.top().p) {
            q.pop();
            q.push(p[i]);
        }
    }
    ll ans = 0;
    while(!q.empty()) {
        ans += q.top().p;
        q.pop();
    }
    cout << ans << endl;
    return 0;
}
View Code

 

bzoj1572 [Usaco2009 Open]工作安排Job