KEYENCE Programming Contest 2021 B - Mex Boxes(思维)

题意:

在这里插入图片描述

解法:

题目说每个盒子的贡献是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;
}

猜你喜欢

转载自blog.csdn.net/weixin_44178736/article/details/112724406