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 }

时间: 2024-08-01 10:31:43

51nod 1163 最高的奖励(贪心+优先队列)的相关文章

51NOD 1163 最高的奖励

来源:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1163 这个题 自己想了想 mmp 感觉一做贪心题只会用 sort 忽略了 优先队列 这题搜了题解后 大概明白了  就是建立一个最小堆  把cost 压入最小堆 如果当前时间 > Q.size() 说明可以直接加 如果小于等于 就要把cost 压入后 取一个最小的出来 挺好的一个题 #include <bits/stdc++.h> using namespa

NYOJ 1107 最高的奖励(贪心+优先队列)

最高的奖励 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 请问:挖掘机技术哪家强?AC了告诉你! 给你N(N<=3*10^4)个任务,每个任务有一个截止完成时间t(1=<t<=10^9)和完成该任务的奖励v(1=<v<=10^9),每个任务要花一天完成,问最多能获得多少奖励? 输入 多组 测试数据.第一行一个数N,表示任务总数.接下来N行,每行两个数t和v,如上所述. 输出 对于每组数据输出最高的奖励. 样例输入 7 4 20 2 60 4 7

1163 最高的奖励 贪心 + 并查集

http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1163 首先如果时间大于n,也就是相当于不限时了,因为完成前n - 1项任务需要时间n - 1,不影响我的第n项. 首先按价值排序,然后这个价值安排在它准备过期的那一天,如果被占据了,就找下一天,就能优先吃到了最大值.而且你吃其他也是耗费一个空间,所以吃个更大的是最优的. 然后可以用并查集来维护,记录topre[i]表示第i个位置的上一个空位是谁. 就能加速找到了. 不然

51nod 1163 贪心

http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1163 1163 最高的奖励 基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题 收藏 关注 有N个任务,每个任务有一个最晚结束时间以及一个对应的奖励.在结束时间之前完成该任务,就可以获得对应的奖励.完成每一个任务所需的时间都是1个单位时间.有时候完成所有任务是不可能的,因为时间上可能会有冲突,这需要你来取舍.求能够获得的最高奖励. Inp

poj3190Stall Reservations(贪心+优先队列)

题目链接: 啊哈哈,点我点我 思路: 首先根据挤奶时间的先后顺序排序...然后将第一头牛加入优先队列..然后就是加入优先队列的牛应该根据越早结束挤奶那么优先级更高,如果时间结束点相等,那么开始时间早的优先级高... 然后从前向后枚举.如果碰到有牛的挤奶时间的开始值大于优先队列的首部的结束值,那么说明这两头牛可以一起公用一个挤奶房..然后从优先队列中删除这头牛..那么这个问题就得到解决了... 题目: Language: Default Stall Reservations Time Limit:

poj 2431 Expedition (贪心+优先队列)

Expedition Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6890   Accepted: 2065 Description A group of cows grabbed a truck and ventured on an expedition deep into the jungle. Being rather poor drivers, the cows unfortunately managed to

BZOJ 2151 种树 贪心+优先队列+HASH

题意:链接 方法:贪心+优先队列 解析: 首先裸上贪最大的肯定不对. DP可行么?可行,两个数组一个记录选一个记录不选好像差不多n^2? 不过还是想想贪心. 贪最大的为什么不对? 因为有可能它旁边的两个加起来比它更优越? 所以能否找到一点关系呢? 既然话都说到这了,两个加起来可能更优越. 所以我们在选了最大的之后是否应该回推一个值呢?代表选旁边俩. 我们发现选旁边俩是两个单位,选一个是一个单位,如果我们推回去某个值后这个值相当于对应删去一个单位选两个单位,即增加一个单位,这显然不会影响最终我们选

POJ1456Supermarket(贪心+优先队列)

Supermarket Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 9103   Accepted: 3891 Description A supermarket has a set Prod of products on sale. It earns a profit px for each product x∈Prod sold by a deadline dx that is measured as an int

[POJ1456]Supermarket(贪心 + 优先队列 || 并查集)

传送门 1.贪心 + 优先队列 按照时间排序从前往后 很简单不多说 ——代码 1 #include <queue> 2 #include <cstdio> 3 #include <iostream> 4 #include <algorithm> 5 #define N 10001 6 7 int n, t, ans; 8 std::priority_queue <int, std::vector <int>, std::greater &l