51nod 1163 最高的奖励

来源:互联网 发布:工作照软件 编辑:程序博客网 时间:2024/05/20 10:12

先建一个优先队列,小根堆,然后按照任务的时间升序排序,然后从头开始扫,如果当前的时间没有超过任务的最晚结束时间,就把任务扔到优先队列里,然后继续扫,当扫到某个任务,发现他的最晚结束时间已经过去了,就从优先队列里出来一个最小的,他俩比较,如果当前的任务获得的奖励更高,就把队列里的那个之前的任务替换掉。这样扫完,队列里的任务就是获得奖励最高的任务了。然后加和就好了。

#include <bits/stdc++.h>using namespace std;const int MAXN = 50010;pair<int,int> task[MAXN];priority_queue<int,vector<int>,greater<int>> que;int n;int main(){    ios::sync_with_stdio(false);    cin >> n;    for(int i = 0; i < n; ++i)        cin >> task[i].first >> task[i].second;    sort(task,task+n);    for(int i = 0; i < n; ++i)    {        if(que.size() < task[i].first)            que.push(task[i].second);        else if(task[i].second > que.top())        {            que.pop();            que.push(task[i].second);        }    }    long long res = 0;    while(!que.empty())    {        res += que.top();        que.pop();    }    cout << res <<endl;}
原创粉丝点击