51nod 1163 最高的奖励(贪心+优先队列)
Posted GraceSkyer
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了51nod 1163 最高的奖励(贪心+优先队列)相关的知识,希望对你有一定的参考价值。
题目链接:51nod 1163 最高的奖励
看着这题我立马就想到昨天也做了一道贪心加优先队列的题了奥。
按任务最晚结束时间从小到大排序,依次选择任务,如果该任务最晚结束时间比当前时间点晚,则将该任务的奖励值压入队列,否则将队列中最小的任务的奖励值替换,优先队列按奖励值小的优先。
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #include<queue> 5 using namespace std; 6 typedef long long ll; 7 const int N = 50001; 8 struct task{ 9 int e; 10 int w; 11 }a[N]; 12 bool cmp(task x, task y){ 13 return x.e < y.e; 14 } 15 priority_queue<int, vector<int>, greater<int> >q; 16 int main(){ 17 int n, i, j; 18 ll ans = 0; 19 scanf("%d", &n); 20 for(i = 0; i < n; ++i) 21 scanf("%d%d", &a[i].e, &a[i].w); 22 sort(a, a+n, cmp); 23 for(i = 0; i < n; ++i){ 24 if(a[i].e > q.size()){ 25 //如果该任务最晚结束时间比当前时间点晚 26 q.push(a[i].w); 27 ans += a[i].w; 28 } 29 else{ 30 //可能替换为奖励更高的任务 31 ans += a[i].w; 32 q.push(a[i].w); 33 ans -= q.top(); 34 q.pop(); 35 } 36 } 37 printf("%lld\\n", ans); 38 return 0; 39 }
以上是关于51nod 1163 最高的奖励(贪心+优先队列)的主要内容,如果未能解决你的问题,请参考以下文章