1 条题解

  • 0
    @ 2025-4-11 16:34:53
    #include <bits/stdc++.h>
    using namespace std;
    const int MAXN = 100000;
    int n;
    // [区间右端点] <左端点, 数量>
    map<int, int> e[MAXN + 5];
    // [1,i] 最大的合法区间权值和
    int f[MAXN + 5];
    int main()
    {
        ios::sync_with_stdio(false);
        cin.tie(0);
        cin >> n;
        for (int i = 1; i <= n; i++)
        {
            int a, b;
            cin >> a >> b;
            a = a + 1;
            b = n - b;
            if (a > b)
                continue;
            // 区间 [a,b]
            e[b][a]++;
        }
        for (int i = 1; i <= n; i++)
        {
            f[i] = f[i - 1];
            for (auto now : e[i])
            {
                // [l,r]: w 个人
                int l = now.first;
                int r = i;
                int w = min(r - l + 1, now.second);
                f[i] = max(f[i], f[l - 1] + w);
            }
        }
        cout << n - f[n];
        return 0;
    }
    
    • 1

    信息

    ID
    13395
    时间
    1000ms
    内存
    125MiB
    难度
    7
    标签
    递交数
    20
    已通过
    9
    上传者