题解:P9421 [蓝桥杯 2023 国 B] 班级活动
lailai0916 · · 题解
题意简述
每次修改
解题思路
对于每个元素
- 如果
a_i=2 ,显然无需修改。 - 如果
a_i=1 ,可以直接修改其他元素,也可以把其他元素修改为i 。 - 如果
a_i>2 ,修改多余的a_i-2 个元素,且优先修改为其他a_j=1 的元素。
具体实现:读入
对于
- 如果
s_2\ge s_1 ,说明有足够a_i>2 的元素可以给a_i=1 的元素; - 否则,还要修改
s1-s2 个a_i=1 的元素,每2 个一组,要修改\frac{s1-s2}{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;
}