题目链接
题目大意:给出n(n >=0&&n<=10000)个物品,每个物品有一个价值和一个过期时间,每天可以卖一个物品(过期的物品不可卖),求最大利益。
题目分析:贪心题,按过期时间排个序,将每个物品的价值插入到小根堆中,考虑在插入某个物品时,先判断堆的大小和这个物品的过期时间,若这个物品的过期时间大于堆的大小,则直接插入堆中;若这个物品的过期时间小于堆的大小,则说明必须做出舍弃,比较一下堆顶和这个物品的价值大小(要换的话先换掉价值最小的),若堆顶小于该物品的价值则替换。最后求出整个堆的价值和即可。
代码如下:
# include <iostream>
# include <cstdio>
# include <cmath>
# include <algorithm>
# include <queue>
using namespace std;
typedef pair<int, int> P;
const int N = 1e4 + 5;
int n;
P a[N];
int main() {
while (cin >> n) {
for (int i = 1; i <= n; i++)
cin >> a[i].second >> a[i].first;
sort(a + 1, a + n + 1);
priority_queue<int, vector<int>, greater<int> > que;
que.push(a[1].second);
for (int i = 2; i <= n; i++) {
if (a[i].first <= que.size()) {
if (que.top() < a[i].second) {
que.pop();
que.push(a[i].second);
}
}
else {
que.push(a[i].second);
}
}
int ans = 0;
while (!que.empty()) {
ans += que.top();
que.pop();
}
cout << ans << endl;
}
return 0;
}