最高的奖励
有N个任务,每个任务有一个最晚结束时间以及一个对应的奖励。在结束时间之前完成该任务,就可以获得对应的奖励。完成每一个任务所需的时间都是1个单位时间。有时候完成所有任务是不可能的,因为时间上可能会有冲突,这需要你来取舍。求能够获得的最高奖励。
7 4 20 2 60 4 70 3 40 1 30 4 50 6 10
230
【分析】从后往前算,用优先队列,每次加上最大值。贪心
加完后,时间不一定为0,WA了好久。。。一定要让时间回到0。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <vector>
#include <algorithm>
using namespace std;
typedef long long LL;
const int maxn = 50000 + 10;
#define cl(a,b) memset(a,b,sizeof a);
priority_queue<int> q;
struct f
{
int x,y;
}a[maxn];
int cmp(f n,f m)
{
return n.x >= m.x;
}
int main()
{
int n;
while(~scanf("%d",&n)){
cl(a,0);
for(int i=0;i<n;i++){
int x,y;
scanf("%d %d",&x,&y);
a[i].x = min(x,n);
a[i].y = y;
}
sort(a,a+n,cmp);
LL sum = 0;
int r=n;
while(q.size()){
q.pop();
}
for(int i=0;i<n;){
while(a[i].x < r && r>0){
r--;
if(q.size()){
sum += q.top();
q.pop();
}
}
while(a[i].x == r&&r){
q.push(a[i].y);
i++;
}
}
while(r--)
if(q.size()){
sum += q.top();
q.pop();
}
printf("%lld\n",sum);
}
return 0;
}