您的位置:首页 > 其它

51nod 1163 最高的奖励

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

#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: