题意:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210116204247108.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDE3ODczNg==,size_16,color_FFFFFF,t_70)
解法:
题目说每个盒子的贡献是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;
}