题意:
解法:
题目说每个盒子的贡献是mex{
盒子里的数},
因此一个盒子有贡献,首先需要有0,假设0的个数为cnt[0],
又因为只有k个盒子,因此cnt[0]要对k取min,令cc=min(cnt[0],k),ans=cc.
在有0的基础上,放里面添加1,每添加一个1,总贡献就加1,
但是1的个数不能超过当前0的个数,
因此cc=min(cc,cnt[1]),ans+=min(cc,cnt[1]),
遍历一下即可:
for(int i=1;i<=n;i++){
cc=min(cc,cnt[i]);
ans+=cc;
}
code:
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int maxm=3e5+5;
int cnt[maxm];
int a[maxm];
int n,k;
signed main(){
ios::sync_with_stdio(0);
cin>>n>>k;
for(int i=1;i<=n;i++){
cin>>a[i];
cnt[a[i]]++;
}
int cc=min(cnt[0],k);
int ans=cc;
for(int i=1;i<=n;i++){
cc=min(cc,cnt[i]);
ans+=cc;
}
cout<<ans<<endl;
return 0;
}