Codeforces Round #792 (Div. 1 + Div. 2) E. MEX vs DIFF(贪心?)

博客介绍了如何在Codeforces Round #792的比赛中,利用贪心策略解决一个关于数组操作的问题。题目要求在最多k次操作内调整数组,使得数组中不同元素的数量diff减小,同时减小diff与mex的差值。作者通过确定最大mex,然后用出现次数少的元素填补,以达到最小化目标。代码实现中涉及了map和multiset的数据结构以及排序操作。
摘要由CSDN通过智能技术生成

Codeforces Round #792 (Div. 1 + Div. 2) E. MEX vs DIFF(贪心?)

链接
题意:给出数组,可以改变k次,每次把一个数字改变成另一个,diff的定义是数组里面出现的不同的数字个个数,现在要操作最多k次让 d i f f − m e x diff-mex diffmex最小
思路:我们可以先确定最大的mex,我们确定了一个mex,那这个mex以内的diff等于mex,此时的贡献是0,那我们就只需要让后面的diff尽可能的减小,所有我们就要用出现次数小的补前面的空白,大概就算这样,还有一些地方就不写了,随便写写

#include<bits/stdc++.h>
using namespace std;
const int N = 2e5+10;
int a[N];
int main()
{
    int T;
    cin >> T;
    while (T--) {
        map<int, int> mp;
        multiset<int> st;
        int n, k;
        cin >> n >> k;
        for (int i = 1; i <= n; i++) {cin >> a[i]; mp[a[i]]++; st.insert(a[i]);}
        int tmp = k;
        int mex;
        for(mex = 0;; mex++) {
            if (st.count(mex)) continue;
            if (tmp == 0) break;
            auto it = prev(st.end());
            if (*it < mex) break;
            tmp--;
            st.erase(it);
        }
        if (mex >= n) {cout << 0 << endl; continue;}
        vector<int> vec;
        for (auto it : mp) if (it.first > mex) vec.push_back(it.second);
        sort(vec.begin(), vec.end());
        int idx = 0;
        while (idx < vec.size() && k >= vec[idx]) {
            k -= vec[idx]; idx++;
        }cout << vec.size() - idx << endl;
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值