蓝桥杯-班级活动

题目描述

小明的老师准备组织一次班级活动。班上一共有 ( n ) 名(( n ) 为偶数)同学,老师想把所有的同学进行分组,每两名同学一组。为了公平,老师给每名同学随机分配了一个 ( n ) 以内的正整数作为 id,第 ( i ) 名同学的 id 为 ( a_i )。

老师希望通过更改若干名同学的 id 使得对于任意一名同学 ( i ),有且仅有另一名同学 ( j ) 的 id 与其相同(( a_i = a_j ))。请问老师最少需要更改多少名同学的 id?

输入格式

输入共 2 行。

第一行为一个正整数 ( n )。

第二行为 ( n ) 个由空格隔开的整数 ( a_1, a_2, ..., a_n )。

输出格式

输出共 1 行,一个整数。

输入输出样例

输入 #1

4

1 2 2 3

输出 #1

1

说明/提示

样例说明

仅需要把 ( a_1 ) 改为 3 或者把 ( a_4 ) 改为 1 即可。

评测用例规模与约定

  • 对于 20% 的数据,保证 ( n <= 10^3 )。
  • 对于 100% 的数据,保证 ( n <= 10^5 )。

题解:

一共有两种情况

  1. 只出现过一次的id个数 cnt1 >= 出现过2次以上的id个数 cnt2。 此时把 所有cnt2 都更改成一个id只出现过一次的, 再加上剩下的 cnt1 / 2
  2. 只出现过一次的id个数 cnt1 < 出现过2次以上的id个数 cnt2。 此时把 cnt1个cnt2 都改成一个id只出现过一次的, 再加上剩下的 cnt2 /2

ps: 说白了就是 当有cnt1的时候, 尽可能把cnt2变成cnt1, 当cnt2有剩余的话, 还需要改变 "剩余的cnt2的个数" 次, 当cnt1有剩余的话, 还需要改变 "剩余的cnt1的个数 / 2"

ac代码👇

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;

unordered_map<int,int> mp;
int main()
{
	int n; cin >> n;
	for (int i = 0; i < n; i ++) 
	{
		int x; cin >> x;
		mp[x] ++;
	}
	int cnt1 = 0, cnt2 = 0;
	for (auto it : mp)
	{
		if (it.second == 1) cnt1 ++;  // id出现过一次的个数
		if (it.second > 2) cnt2 += it.second - 2;  // id出现次数大于2的都要改成别的id
	}
	if (cnt2 - cnt1 >= 0) cout << cnt1 + (cnt2 - cnt1) << endl;  // 情况1
	else  cout << cnt2 + (cnt1 - cnt2) / 2 << endl;    // 情况2
	return 0;	
}

觉得写的不错的话, 点个赞吧~

相关推荐
xvhao20132 分钟前
P4084 [USACO17DEC] Barn Painting G 题解
数据结构·c++·算法·深度优先·动态规划
云栖梦泽5 分钟前
Linux内核与驱动:5.并发与竞争
linux·c++
We་ct12 分钟前
LeetCode 190. 颠倒二进制位:两种解法详解
前端·算法·leetcode·typescript
wangchunting14 分钟前
算法-二分查找
java·数据结构·算法
月落归舟19 分钟前
帮你从算法的角度来认识二叉树---(一)
数据结构·算法·二叉树
不想看见40420 分钟前
在AI时代下,刷LeetCode题的价值与意义
开发语言·c++·qt
Kk.080222 分钟前
数据结构|排序算法(三)堆排序
java·数据结构·排序算法
像素猎人27 分钟前
蓝桥杯OJ359求和【2022年蓝桥杯省赛真题】【动态规划压轴题】【详解是用ai生成的】
蓝桥杯
南境十里·墨染春水32 分钟前
C++ 笔记 多重继承 菱形继承(面向对象)
开发语言·c++·笔记
龙文浩_33 分钟前
AI深度学习演进之路:从机器学习到大模型的范式变革
人工智能·深度学习·神经网络·算法·回归·线性回归