最高奖励
有N个任务,每个任务有一个最晚结束时间以及一个对应的奖励。在结束时间之前完成该任务,就可以获得对应的奖励。完成每一个任务所需的时间都是1个单位时间。有时候完成所有任务是不可能的,因为时间上可能会有冲突,这需要你来取舍。求能够获得的最高奖励。
输入包含多组数据。
每组数据第1行:一个数N,表示任务的数量(2 <= N <= 50000)
第2 - N + 1行,每行2个数,中间用空格分隔,表示任务的最晚结束时间E[i]以及对应的奖励W[i]。(1 <= E[i] <= 10^9,1 <= W[i] <= 10^9)
7
4 20
2 60
4 70
3 40
1 30
4 50
6 10
题意:中文题。
思路:因为过了截止时间,就不能再继续做任务了。所以按照时间的升序排列,从后往前遍历。将任务依次放入优先队列中。
如果两个任务之间的截止时间不相同,这时候在优先队列里面的都是满足可以做任务的要求。取出队首相加就行了。
代码:
- #include <iostream>
- #include <cstdio>
- #include <cstring>
- #include <algorithm>
- #include <queue>
- using namespace std;
- struct node
- {
- int e,w;
- friend bool operator <(node a,node b)
- {
- return a.w<b.w;
- }
- }q[50005];
- bool cmp(node a,node b)
- {
- if(a.e!=b.e)
- return a.e<b.e;
- return a.w<b.w;
- }
- priority_queue<node> que;
- int main()
- {
- int n;
- while(~scanf("%d",&n))
- {
- while(!que.empty()) que.pop();
- long long ans=0;
- for(int i=1;i<=n;i++)
- {
- scanf("%d%d",&q[i].e,&q[i].w);
- }
- sort(q+1,q+n+1,cmp);
- q[0].e=0;
- for(int i=n;i>=1;i--)
- {
- que.push(q[i]);
- if(q[i].e!=q[i-1].e)
- {
- for(int j=1;j<=q[i].e-q[i-1].e;j++)
- {
- if(!que.empty())
- {
- ans+=(long long)que.top().w;
- que.pop();
- }
- else break;
- }
- }
- }
- printf("%lld\n",ans);
- }
- return 0;
- }