CF332C Students' Revenge 题解

首先,无论我们怎么选,主任一定会选不满意度最大、变白度尽量小的任务。也就是无论我们怎么选,主任都会有一个固定的选任务的顺序。显然这个顺序就是按照不满意度递减,其次变白度递增排序后的顺序。我们记它为 \(id\)。显然,\(id\) 最小的 \(p-k\) 个主任一定不会选。

现在只需要考虑前 \(n-(p-k)\) 个主任可能选的任务。我们希望主任选变白度尽量高的任务,那么按照变白度递减排序,取前 \(k\) 个给主任显然最优。

其次我们希望剩下的不满意度最大,那么剩下的 \(id\) 要尽可能小。但是我们首先要满足主任会选前面的 \(k\) 个任务,那么剩下的任务的 \(id\) 要比前 \(k\) 个任务小。所以前 \(k\) 个任务的 \(id\) 也要尽可能小。

那么我们将任务按照变白度递减,其次按照 \(id\) 递增排序,取前 \(k\) 个。设这 \(k\) 个中的最大 \(id\)\(mx\),那么剩下 \(p-k\) 个取 \(id>mx\) 的最小的几个即可。

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1e5 + 5;
int n, p, k;
struct node
{
    int a, b, id1, id2;
}a[N];
signed main()
{
    cin.tie(0) -> sync_with_stdio(0);
    cin >> n >> p >> k;
    for(int i = 1; i <= n; i++)
        cin >> a[i].a >> a[i].b, a[i].id1 = i;
    sort(a + 1, a + 1 + n, [](node a, node b) { return a.b == b.b ? a.a < b.a : a.b > b.b; });
    for(int i = 1; i <= n; i++)
        a[i].id2 = i;
    sort(a + 1, a + 1 + (n - p + k), [](node a, node b) { return a.a == b.a ? a.id2 < b.id2 : a.a > b.a; });
    int mx = 0;
    for(int i = 1; i <= k; i++)
        cout << a[i].id1 << ' ', mx = max(mx, a[i].id2);
    for(int i = 1; i <= n; i++)
        if(a[i].id2 > mx && a[i].id2 <= mx + p - k)
            cout << a[i].id1 << ' ';
    return 0;
}
posted @ 2025-10-13 16:06  Luckies  阅读(2)  评论(0)    收藏  举报