题意:
每个商品都有利润和保质期,在保质期内,能够卖出的最高利润.
思路:
显然最长时间就是所有商品中的最大保质期,时间自然是递减的,然后利用优先队列取出最大利润的商品.
枚举截止时间,商品的保质期在截止时间之后的才能入队,为了保证队内的物品不过期,截止时间应从最长时间递减.
代码:
#include<queue>
#include<algorithm>
#include<cstring>
#include<cstdio>
using namespace std;
const int maxn = 10010;
struct pro {
int p, d;
bool operator < (const pro& a) const{
return p<a.p;
}
}q[maxn];
int n;
int cmp(pro a, pro b) {
return a.d > b.d;
}
int main() {
int t;
while(scanf("%d", &n) == 1) {
t = 0;
for(int i=0; i<n; i++) {
scanf("%d%d", &q[i].p, &q[i].d);
t = max(t, q[i].d);
}
priority_queue<pro> u;
sort(q, q+n, cmp);
int ans = 0, j=0;
for(int i=t; i>0; i--) {
while(j < n && q[j].d >= i)
u.push(q[j++]);
if(!u.empty()) {
pro tmp = u.top();
ans += tmp.p;
u.pop();
}
}
printf("%d\n", ans);
}
return 0;
}