洛谷P9421 [蓝桥杯 2023 国 B] 班级活动
P9421 [蓝桥杯 2023 国 B] 班级活动
题目描述
小明的老师准备组织一次班级活动。班上一共有 \(n\) 名(\(n\) 为偶数)同学,老师想把所有的同学进行分组,每两名同学一组。为了公平,老师给每名同学随机分配了一个 \(n\) 以内的正整数作为 id,第 \(i\) 名同学的 id 为 \(a_i\)。
老师希望通过更改若干名同学的 id 使得对于任意一名同学 \(i\),有且仅有另一名同学 \(j\) 的 id 与其相同(\(a_i = a_j\))。请问老师最少需要更改多少名同学的 id?
输入格式
输入共 \(2\) 行。
第一行为一个正整数 \(n\)。
第二行为 \(n\) 个由空格隔开的整数 \(a_1, a_2, \cdots, a_n\)。
输出格式
输出共 \(1\) 行,一个整数。
输入输出样例 #1
输入 #1
4
1 2 2 3
输出 #1
1
说明/提示
样例说明
仅需要把 \(a_1\) 改为 \(3\) 或者把 \(a_4\) 改为 \(1\) 即可。
评测用例规模与约定
- 对于 \(20\%\) 的数据,保证 \(n \le 10^3\)。
- 对于 \(100\%\) 的数据,保证 \(n \le 10^5\)。
第十四届蓝桥杯大赛软件赛决赛 C/C++ 大学 B 组 C 题
题目链接
https://www.luogu.com.cn/problem/P9421
解题思路
- 每一个 id 恰好出现 2 次,则可以分为大于等于2和小于2,cnt[i]表示id=i的次数
- 超额的数量sum1就可以加上从cnt[i]-2得到,单身数量sum2加上cnt[i]即可(有些id没出现为0不影响答案)
- sum1 > sum2,则sum1 名额足够把所有单身全部消化掉;否则sum1 名额用完,还剩sum2-sum1个单身,剩下单身两两配对
代码实现
// 模拟
#include<bits/stdc++.h>
using namespace std;
using ll=long long;
const int N=1e6+9;
int a[N],cnt[N];
ll ans;
int main()
{
int n;cin>>n;
for(int i=0;i<n;i++){
int x;cin>>x;
cnt[x]++;
}
ll sum1=0,sum2=0;
for(int i=1;i<=1e6;i++){
if(cnt[i]>=2)sum1+=(cnt[i]-2);
else sum2+=cnt[i];
}
if(sum1>sum2)ans=sum1;
else ans=sum1+(sum2-sum1)/2;
cout<<ans<<'\n';
return 0;
}
浙公网安备 33010602011771号