有N个任务,每个任务有一个最晚结束时间以及一个对应的奖励。在结束时间之前完成该任务,就可以获得对应的奖励。完成每一个任务所需的时间都是1个单位时间。有时候完成所有任务是不可能的,因为时间上可能会有冲突,这需要你来取舍。求能够获得的最高奖励。
第2 - N + 1行,每行2个数,中间用空格分隔,表示任务的最晚结束时间E i 以及对应的奖励W i 。(1 <= E i <= 10^9,1 <= W i
7 4 20 2 60 4 70 3 40 1 30 4 50 6 10
230
分析:每个任务完成需要一个单位时间。那么不妨先将任务按结束时间排序。依次遍历每个任务,如果当前时间足够完成该任务,则加入队列,如果冲突,则比较队列中价值最小的元素,如果该任务价值高,则替换之
代码:
#include<stdio.h>
#include<algorithm>
#include<queue>
#include<string.h>
using namespace std;
typedef long long ll;
struct node{
int t;
int val;
}arr[50005];
int cmp(node a,node b){
if(a.t==b.t) return a.val>b.val;
return a.t<b.t;
}
bool operator<(node a,node b){
if(a.val==b.val) return a.t>b.t;
return a.val>b.val;
}
int main(){
int n;
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d%d",&arr[i].t,&arr[i].val);
}
sort(arr,arr+n,cmp);
priority_queue<node>p;
p.push(arr[0]);
for(int i=1;i<n;i++){
node temp=p.top();
int len=p.size();
if(len==arr[i].t){
if(arr[i].val>temp.val){
p.pop();
p.push(arr[i]);
}
}
else p.push(arr[i]);
}
ll sum=0;
while(!p.empty()){
sum+=p.top().val;
p.pop();
}
printf("%lld\n",sum);
return 0;
}