Codeforces Round #792 (Div. 1 + Div. 2) E. MEX vs DIFF(贪心?)
链接
题意:给出数组,可以改变k次,每次把一个数字改变成另一个,diff的定义是数组里面出现的不同的数字个个数,现在要操作最多k次让
d
i
f
f
−
m
e
x
diff-mex
diff−mex最小
思路:我们可以先确定最大的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;
}