AcWing 145. 超市
贪心策略:
在不过期的时间内优先卖出利润更大的产品。
按照价值降序,每次扫描到一个价值,尝试一下在过期之前能不能卖出去;
此时可能已经有比它更大价值的产品占用了一些日期,于是从过期时间往前面找,直到找到一个空位置。
如果这个空位置大于0(就是过期之前的日期没有被占满),那么就把这个产品安排在这天卖出。
#include <iostream>
#include <cstdio>
#include <algorithm>
const int N = 10005;
int fa[N];
struct node
{
int p, d;
bool operator < (const node &x) const
{
return p > x.p;
}
}a[N];
int max(int a, int b)
{
return a > b ? a : b;
}
int get(int x)
{
if(fa[x] == x) return x;
int r = x, k = x;
while(fa[r] != r)
{
r = fa[r];
}
while(x != r)
{
k = fa[x];
fa[x] = r;
x = k;
}
return r;
}
int main()
{
int n;
while(scanf("%d", &n) != EOF)
{
int ans = 0, maxd = 0;
for(int i = 0; i < n; ++i)
{
scanf("%d %d", &a[i].p, &a[i].d);
maxd = max(maxd, a[i].d);
}
std::sort(a, a+n);
for(int i = 0; i <= maxd; ++i)
{
fa[i] = i;
}
for(int i = 0; i < n; ++i)
{
int x = get(a[i].d);
if(x > 0)
{
ans += a[i].p;
fa[x] = x - 1;
}
}
printf("%d\n", ans);
}
return 0;
}