原题链接:
https://codeforces.com/problemset/problem/2149/C
题目含义:
m
e
x
mex
mex:在一组数中,最小且不存在(不在这个集合中)的数
把mex
的值通过一些操作,使它变成k,求最小操作数
解题思路:
首先,这组数不能存在k,只要有k,就需要一次操作
其次,找到这组数中的mex
,一共有几个这样的数(这里其实就是模拟整个变化过程,通过计数就可以转化为O(1)的做法)
最后,只需要比较前面两次计数的大小,取最大值
为什么会取最大值?
我们计算数组中等于k的个数时,其实就会算mex
,只不过计数不完全,反过来同样,都会计数不完全,而两种操作可以互补,两者都有可能比另一方多,取最大值即可。
完整代码:
#include <iostream>
#include <algorithm>
#include <set>
using namespace std;
typedef long long ll;
void solve()
{
int n,k;
cin>>n>>k;
set<int>st;
int cnt=0,count=0;
for(int i=0;i<n;i++){
int x;
cin>>x;
if(x==k)cnt++;
st.insert(x);
}
for(int i=0;i<k;i++){
if(st.find(i)==st.end())count++;
}
cout<<max(cnt,count)<<endl;
}
int main ()
{
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
int t=1;
cin>>t;
while(t--)
solve();
return 0;
}