优先队列+贪心
贪心策略:从第10000天开始,每天尽量选没过期的最贵的就行了。
对于第i天最贵的商品:
1.如果把这个最贵的留给前面(前面指第1~i-1天)去选:因为从前往后可选的商品不断减少,前面说不定可以选更贵的,所以留给前面不如留给第i天。
2.如果这个最贵商品既不留给前面,第i天也不选,那结果肯定不如第i天选最贵的。
C++ 代码
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<vector>
#include<queue>
using namespace std;
const int maxn = 1e4+5, inf = 0x3f3f3f3f;
struct node{
int p, d;
static inline bool cmp(node &a, node &b)
{
return a.d < b.d;
}
bool operator< (node b) const
{
return p < b.p;
}
} num[maxn];
priority_queue<node, vector<node>, less<node> > q;
int n;
int main()
{
while(scanf("%d", &n) != -1)
{
while(!q.empty()) q.pop();
for(int i=1; i<=n; ++i)
{
scanf("%d%d", &num[i].p, &num[i].d);
}
sort(num+1, num+n+1, node::cmp);
int j = n;
int ans = 0;
for(int i=10000; i>=1; --i)
{
// if(i<=30) printf("ans %d size %d\n", ans, q.size());
while(j>0 && num[j].d >= i) q.push(num[j]), --j;
if(!q.empty()) ans += q.top().p, q.pop();
}
printf("%d\n", ans);
}
return 0;
}