NEFU 1265 (贪心+优先队列)

12 篇文章 0 订阅

最高奖励

Problem:1265
Time Limit:1000ms
Memory Limit:65535K

Description

有N个任务,每个任务有一个最晚结束时间以及一个对应的奖励。在结束时间之前完成该任务,就可以获得对应的奖励。完成每一个任务所需的时间都是1个单位时间。有时候完成所有任务是不可能的,因为时间上可能会有冲突,这需要你来取舍。求能够获得的最高奖励。

Input

输入包含多组数据。
每组数据第1行:一个数N,表示任务的数量(2 <= N <= 50000)
第2 - N + 1行,每行2个数,中间用空格分隔,表示任务的最晚结束时间E[i]以及对应的奖励W[i]。(1 <= E[i] <= 10^9,1 <= W[i] <= 10^9)

Output

输出能够获得的最高奖励。

Sample Input

7
4 20
2 60
4 70
3 40
1 30
4 50
6 10

Sample Output

230

题意:中文题。

思路:因为过了截止时间,就不能再继续做任务了。所以按照时间的升序排列,从后往前遍历。将任务依次放入优先队列中。

如果两个任务之间的截止时间不相同,这时候在优先队列里面的都是满足可以做任务的要求。取出队首相加就行了。

代码:

[cpp]  view plain  copy
  1. #include <iostream>  
  2. #include <cstdio>  
  3. #include <cstring>  
  4. #include <algorithm>  
  5. #include <queue>  
  6. using namespace std;  
  7. struct node  
  8. {  
  9.     int e,w;  
  10.     friend bool operator <(node a,node b)  
  11.     {  
  12.         return a.w<b.w;  
  13.     }  
  14. }q[50005];  
  15. bool cmp(node a,node b)  
  16. {  
  17.     if(a.e!=b.e)  
  18.         return a.e<b.e;  
  19.     return a.w<b.w;  
  20. }  
  21. priority_queue<node> que;  
  22. int main()  
  23. {  
  24.     int n;  
  25.     while(~scanf("%d",&n))  
  26.     {  
  27.         while(!que.empty()) que.pop();  
  28.         long long ans=0;  
  29.         for(int i=1;i<=n;i++)  
  30.         {  
  31.             scanf("%d%d",&q[i].e,&q[i].w);  
  32.         }  
  33.         sort(q+1,q+n+1,cmp);  
  34.         q[0].e=0;  
  35.         for(int i=n;i>=1;i--)  
  36.         {  
  37.             que.push(q[i]);  
  38.             if(q[i].e!=q[i-1].e)  
  39.             {  
  40.                 for(int j=1;j<=q[i].e-q[i-1].e;j++)  
  41.                 {  
  42.                     if(!que.empty())  
  43.                     {  
  44.                         ans+=(long long)que.top().w;  
  45.                         que.pop();  
  46.                     }  
  47.                     else break;  
  48.                 }  
  49.             }  
  50.         }  
  51.         printf("%lld\n",ans);  
  52.     }  
  53.     return 0;  
  54. }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值