题目

July 8, 2021 · View on GitHub

超市里有 N 件商品,每件商品都有利润 pi 和过期时间 di,每天只能卖一件商品,过期商品不能再卖。

求合理安排每天卖的商品的情况下,可以得到的最大收益是多少。

输入格式
输入包含多组测试用例。

每组测试用例,以输入整数 N 开始,接下来输入 N 对 pi 和 di,分别代表第 i 件商品的利润和过期时间。

在输入中,数据之间可以自由穿插任意个空格或空行,输入至文件结尾时终止输入,保证数据正确。

输出格式
对于每组产品,输出一个该组的最大收益值。

每个结果占一行。

数据范围
0≤N≤10000,
1≤pi,di≤10000
最多有 14 组测试样例

输入样例:

4  50 2  10 1   20 2   30 1

7  20 1   2 1   10 3  100 2   8 2
   5 20  50 10

输出样例:

80
185

参考答案

#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e4 + 233;
typedef pair<int,int> pii;
vector<pii> a;
int f[maxn];
int ff(int x)
{
    if(f[x] == x) return x;
    return f[x] = ff(f[x]);
}
int main()
{
    int n;
    while(cin >> n)
    {
        int ans = 0;
        a.clear();
        int maxe = 0;

        for(int i = 1; i <= n; i++)
        {
            int v,e;
            scanf("%d%d", &v, &e);
            a.push_back({-v, e});
            maxe = max(maxe, e);
        }
        for(int i = 0; i <= maxe; i++) f[i] = i;
        sort(a.begin(), a.end());
        for(int i = 0; i < a.size(); i++)
        {
            int v = -a[i].first, e = a[i].second;
            int pos = ff(e);
            if(pos > 0)
            {
                ans += v;
                f[pos] = pos - 1;
            }
        }
        printf("%d\n", ans);
    }
}