CodeForces Round 1054(div.3)C题
原题链接:
https://codeforces.com/problemset/problem/2149/C
题目含义:
mexmexmex:在一组数中,最小且不存在(不在这个集合中)的数
把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;
}