题解: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;
}
}

浙公网安备 33010602011771号