有N个任务,每个任务有一个最晚结束时间以及一个对应的奖励。在结束时间之前完成该任务,就可以获得对应的奖励。完成每一个任务所需的时间都是1个单位时间。有时候完成所有任务是不可能的,因为时间上可能会有冲突,这需要你来取舍。求能够获得的最高奖励。
Input第1行:一个数N,表示任务的数量(2 <= N <= 50000)
第2 - N + 1行,每行2个数,中间用空格分隔,表示任务的最晚结束时间Ei以及对应的奖励Wi。(1 <= Ei <= 10^9,1 <= Wi <= 10^9)Output输出能够获得的最高奖励。Sample Input
7 4 20 2 60 4 70 3 40 1 30 4 50 6 10Sample Output
230
先排序,在入队
代码:
#include <iostream> #include <cstdio> #include <queue> #include <map> #include <algorithm> using namespace std; int n; struct assign { int time,award; friend bool operator <(assign a,assign b) { return a.award>b.award; } }as[50000]; int cmp(assign a,assign b) { return a.time<b.time; } int main() { int n; long long sum=0; priority_queue <assign>q; scanf("%d",&n); for(int i=0;i<n;i++) { scanf("%d %d",&as[i].time,&as[i].award); } sort(as,as+n,cmp); for(int i=0;i<n;i++) { q.push(as[i]); sum+=as[i].award; if(i<n-1&&as[i+1].time!=as[i].time) { while(q.size()>as[i].time) { sum-=q.top().award; q.pop(); } } } while(q.size()>as[n-1].time) { sum-=q.top().award; q.pop(); } printf("%lld",sum); }