• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
sn-genuine
博客园    首页    新随笔    联系   管理    订阅  订阅

洛谷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

解题思路

  1. 每一个 id 恰好出现 2 次,则可以分为大于等于2和小于2,cnt[i]表示id=i的次数
  2. 超额的数量sum1就可以加上从cnt[i]-2得到,单身数量sum2加上cnt[i]即可(有些id没出现为0不影响答案)
  3. 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;
}
posted on 2026-09-10 20:11  SobNov  阅读(18)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3