首页 > 代码库 > 51nod 1163 最高的奖励(贪心+优先队列)
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 最高的奖励(贪心+优先队列)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。