题目链接:
题意:
有n个工作,每个工作有一个截止日期dead[i]和收益pay[i]。
完成一项工作需要花费1的时间。
问你最大收益。
题解:
贪心。
先将n个工作按dead从小到大排序。
开一个优先队列q(升序),保存当前选了的工作的pay。
枚举每个工作i:
(1)如果当前q中的工作数 < pay[i],说明在pay[i]及之前的时间还有没用的。所以直接选这个工作。
(2)如果当前q中的工作数 = pay[i],说明没有空闲时间了。所以如果q中最小的收益比pay[i]还小,则用当前工作替换掉。
最后q中剩下的就是最终要选的工作。
AC Code:
1 #include2 #include 3 #include 4 #include 5 #include 6 #define MAX_N 100005 7 8 using namespace std; 9 10 struct Work11 {12 long long dead;13 long long pay;14 Work(long long _dead,long long _pay)15 {16 dead=_dead;17 pay=_pay;18 }19 Work(){}20 friend bool operator < (const Work &a,const Work &b)21 {22 return a.dead ,greater > q;30 31 void read()32 {33 cin>>n;34 for(int i=0;i >work[i].dead>>work[i].pay;37 }38 }39 40 void solve()41 {42 sort(work,work+n);43 for(int i=0;i