题解:P9421 [蓝桥杯 2023 国 B] 班级活动
· 阅读需 2 分钟
原题链接
题意简述
每次修改 个元素,求序列中刚好每 个元素相同的最小操作次数。
解题思路
- 对于每个元素 的出现次数 ,分类讨论:
- 若 ,不用修改。
- 若 ,可以直接修改其他元素,也可以把其他元素修改为 。
- 若 ,修改多余的 个元素,且优先修改成其他 的元素。
- 代码实现:
- 读入 ,记录每个数出现的次数 ;
- 枚举所有的 :
- 如果 ,说明有足够 的元素可以给 的元素;
- 否则,还要修改 个 的元素,每 个一组,要修改 个元素。
- 因此,最终答案为 。
参考代码
#include <bits/stdc++.h>
using namespace std;
const int N=100005;
int a[N];
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
int t;
cin>>t;
a[t]++;
}
int s1=0,s2=0;
for(int i=1;i<=n;i++)
{
if(a[i]==1)
{
s1+=1;
}
else if(a[i]>2)
{
s2+=a[i]-2;
}
}
cout<<s2+max(s1-s2,0)/2<<'\n';
return 0;
}