搬运我的洛谷题解,原文创作时间:2026-05-14 19:30。

P16460 [UOI 2026] Minimum Deletion

思路

这道题要找一个最小操作次数,使数组的最小未出现值 $m$ 的值不超过 $k$。

思路很简单,要让 $m$ 不超过 $k$,必须满足所有小于 $m$ 的数都在数组中

对于每个合法的 $m$,删除次数就是 $m$ 在数组中出现的次数,最终输出所有合法的 $m$ 中出现的次数最少的那个即可。

代码

#include <bits/stdc++.h>
using namespace std;
int main(){
    int n,k;
    cin>>n>>k;
    int cnt[10]={0};
    for(int i=0;i<n;i++){
        int x;
        cin>>x;
        cnt[x]++;// 统计0至9每个数在数组出现的个数
    }
    int ans=n;
    for(int m=0;m<=k;m++){
        bool flag=true;
        // 检查每个数是否都在
        for(int i=0;i<m;i++){
            if(cnt[i]==0){
                flag=false;
                break;
            }
        }
        if(flag==true){
            if(m<10)ans=min(ans,cnt[m]);
            else ans=min(ans,0);
        }
    }
    cout<<ans;
	return 0;
}

时间复杂度:$O(n + k^2)$,对于 $n \le 10^3$、$k \le 10$ 的数据范围完全足够。