题解:CF2057B Gorilla and the Exam

CF2057B Gorilla and the Exam

思路

不难发现其实每次操作就是把数组 \(a\) 内所有值为 \(y\) 的数都删除掉(\(y\) 为数组 \(a\) 中的莫一个值)。所以我们需要把尽可能多的数都变成原来数组里出现次数最多的数(从出现数量最少的开始,这样能使得消失的数值种类最大化)。首先想到使用数组进行统计,但是又发现 \(a_i\le 10^9\) 远远大于数组可以设置的范围,所以可以使用 MAP。最后的答案为原来数组不同值的种类 \(-\) 消失的数值种类。

AC 代码

#include<bits/stdc++.h>
using namespace std;
long long t,x,n,k,cnt,ans;
map<long long,long long>mp;
bool cmp(pair<long long,long long>&a,pair<long long,long long>&b){
	return a.second<b.second;
}
int main(){
	cin>>t;
	while(t--){
		mp.clear();
		cin>>n>>k;
		cnt=ans=0;
		for(int i=1;i<=n;i++){
			cin>>x;
			mp[x]++;
			if(mp[x]==1) ans++;
		}
		vector<pair<long long,long long>> v(mp.begin(),mp.end());
		sort(v.begin(),v.end(),cmp);
		for(pair<long long,long long> e:v){
			if(e.second<=k) k-=e.second,cnt++;
		}
		cout<<max(1ll,ans-cnt)<<endl;
	}
}

AC 记录

posted @ 2025-01-06 21:56  SuperJimmy  阅读(42)  评论(0)    收藏  举报