题目链接:https://vjudge.net/problem/UVALive-2757
题目大意:有n个商品,商品i的利润为pi,销售截止日期为di(必须不晚于截止日期销售才有利润),销售每个商品需要1天时间。求最大利润。
思路:可以倒过来想,将商品按截止日期从晚到早排序,从大到小枚举日期d,每次将截止日期不晚于d的商品加入优先队列中,然后取出优先队列中的最大值即可。因为是从玩到早加入队列,所以先加入的元素一直到最后都是有效的。
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <cctype>
#include <cstdlib>
#include <map>
#include <iostream>
#include <queue>
using namespace std;
const int maxn = 10000 + 10;
struct Node
{
int p, d;
}node[maxn];
bool cmp(const Node &A, const Node &B)
{
return A.d > B.d;
}
priority_queue<int> q;
int main()
{
int n;
while(scanf("%d", &n) == 1)
{
while(q.size()) q.pop();
for(int i = 0; i < n; i++) scanf("%d%d", &node[i].p, &node[i].d);
sort(node, node+n, cmp);
int ans = 0, cur = 0;
for(int day = node[0].d; day >= 1; day--)
{
while(cur < n && node[cur].d == day) q.push(node[cur++].p);
if(q.size()) { ans += q.top(); q.pop(); }
}
printf("%d\n", ans);
}
return 0;
}