超市里有 N 件商品,每件商品都有利润 pi 和过期时间 di,每天只能卖一件商品,过期商品不能再卖。
求合理安排每天卖的商品的情况下,可以得到的最大收益是多少。
我们的目的是让利润最大,新建一个小根堆(堆中的元素是卖出的方案),节点的权值是商品的利润,将商品按过期时间排序,枚举每个商品,若当前商品的过期时间=堆中元素个数,判断他是否更优,若大于,直接插入即可。
#include <bits/stdc++.h>
using namespace std;
const int N = 1e4 + 10;
int n;
struct node {
int p, d;
}a[N];
priority_queue<int> h;//默认大根堆,把值取负变成小根堆
bool cmp(node x, node y) {
return x.d < y.d;
}
int main() {
while (scanf("%d", &n) != EOF) {
if (!n) {
cout << 0 << endl;
continue;
}
for (int i = 1; i <= n; i ++)
cin >> a[i].p >> a[i].d;
sort(a + 1, a + n + 1, cmp);
for (int i = 1; i <= n; i ++) {
if (a[i].d == h.size() && a[i].p > -h.top()) {
h.pop();
h.push(-a[i].p);
}
if (a[i].d > h.size()) h.push(-a[i].p);
}
int ans = 0;
while (h.size()) {
ans += h.top();
h.pop();
}
cout << -ans << endl;
}
}