NYOJ 1107 最高的奖励(贪心+优先队列)
2015-04-05 09:35
232 查看
最高的奖励
时间限制:1000 ms | 内存限制:65535 KB难度:3
描述
请问:挖掘机技术哪家强?AC了告诉你!
给你N(N<=3*10^4)个任务,每个任务有一个截止完成时间t(1=<t<=10^9)和完成该任务的奖励v(1=<v<=10^9),每个任务要花一天完成,问最多能获得多少奖励?
#include <stdio.h> #include <string.h> #include <iostream> #include <queue> #include <algorithm> using namespace std; const int N = 50005; bool vis ; struct Node{ int day, value; friend bool operator < (const Node a, const Node b) { return a.value > b.value;//value小的优先级高 } }; bool cmp(const Node a, const Node b)//二级排序, 先按照天数来排,天数小的在前,相同天数的情况下再按照奖励大小来排,奖励大的在前 { if (a.day != b.day) return a.day < b.day; return a.value > b.value; } int n; Node node ; int main() { while (~scanf("%d", &n) && n) { for (int i = 0; i < n; i++) { scanf("%d %d", &node[i].day, &node[i].value); } sort(node, node + n, cmp); priority_queue<Node> Q; memset(vis, false, sizeof(vis)); for (int i = 0; i < n; i++) { if (!vis[node[i].day])//如果这一天没有其它任务占有 { vis[node[i].day] = true; Q.push(node[i]); } else { if (Q.size() < node[i].day)//如果这一天前面有空闲的天数 Q.push(node[i]); else { Node tmp = Q.top();//将它与最小值比较,如果大于添加到队列中的最小值,就要替换 if (tmp.value < node[i].value) { Q.push(node[i]); Q.pop(); } } } } long long ans = 0; while (!Q.empty()) { Node tmp = Q.top(); Q.pop(); ans += tmp.value; } cout << ans << endl; } return 0; }
View Code
相关文章推荐
- NYOJ 1107 最高的奖励 【贪心】+【路径压缩】
- 51 nod 最高奖励(贪心+优先队列)
- 51Nod - 116 最高的奖励 ——贪心——优先队列
- 1163 最高的奖励(贪心+优先队列)
- 51nod 1163 最高的奖励 (贪心+优先队列/并查集)&& 1191 消灭兔子(贪心+优先队列维护) && 1475 建设国家 (思维枚举+优先队列)
- 51nod 1163 最高的奖励 (贪心/贪心+优先队列)
- 51NOD 1163——最高的奖励(可用优先队列解决的贪心问题)
- 51nod 1163 最高的 d3da 奖励(超级经典贪心)
- 51Nod 1163 最高的奖励(贪心+优先队列/并查集合)
- 51nod-1163 最高的奖励(贪心)
- 51Nod 1163 最高的奖励(贪心+优先队列 & 并差集)
- NYIST 1107 最高的奖励
- 51nod 1163 最高的奖励 [贪心]【杂类】
- 51nod 1163 最高的奖励(贪心)
- nyoj 1 1 0 7 最高奖励
- 51nod 1163 最高的奖励(贪心+堆)
- 最高的奖励 【贪心】
- 51nod 1164 最高的奖励 V2 贪心+匈牙利算法
- 51nod 1163 最高的奖励(优先队列)
- 51nod 1163 最高的奖励【贪心】