快递员工作-贪心-区间

来源:互联网 发布:知远战略与防务研究所 编辑:程序博客网 时间:2024/06/09 19:25

如有错误,请留言提醒,不要坑到小朋友

Description

Freddy在Vito Maretti镇上得到了一份快递员的工作。一天早上Freddy接到了一份递送N箱威士忌的任务,每箱都要送往不同的地点。送列表上的每箱威士忌都要花掉他一天的时间。但是每份定单(一份定单对应一箱威士忌)都给出了递送的时间限制和奖金。如果Freddy没有在定单指定时间内送到,那么他将得不到奖金,甚至他将被解雇。于是他请你帮他计划一下送货的日程安排以便他能够得到最多的奖金。 

Input

第一行包含一个整数N(1 <= N <= 100000),表示定单数(亦是威士忌的箱数)。其后跟着N 行每行有两个整数:送货时限和能够得到的奖金。送货时限是一个不小于1天不大于100000天的数。奖金的范围是从1到100000元。 

Output

第一行输出他所赚到的钱最多有多少.

Sample Input

41 175 152 102 11

Sample Output

43送货员送第一个、第四个、第二个这三个货物.

Hint

30%数据 N <= 100 
50%数据 N <= 1000 
70%数据 N <= 10000 
100%数据 N <= 100000 


另一个样例 
输入 

1 1 
2 1 
3 12 
3 12 
输出 
25 

可以分析出时间越靠后,限制越少,但他可能会对之前造成影响

所以应尽量让时间靠后的安排更后点

而且在时间充足的情况下,应该能安排就安排

如果不可以全部放,那么我们就应该用最好的

这个可以用堆来维护

#include<iostream>#include<cstdlib>#include<cstdio>#include<cstring>#include<cmath>#include<queue>#include<algorithm>#define maxn 100001using namespace std;int n;struct freddy{int v,t;bool operator < (const freddy &xx) const {return xx.v>v;}}a[maxn];bool cmp(freddy x,freddy y){return x.t>y.t;}priority_queue<freddy>Q;int main(){scanf("%d",&n);for(int i=1;i<=n;i++)scanf("%d%d",&a[i].t,&a[i].v);sort(a+1,a+n+1,cmp);int now=1,ans=0;for(int i=a[1].t;i>=1;i--){while(a[now].t==i){Q.push(a[now]);now++;}if(Q.size()!=0){ans=ans+Q.top().v;Q.pop();}}printf("%d\n",ans);}




原创粉丝点击