蓝桥杯真题——班级活动

目录

题目链接:1.班级活动 - 蓝桥云课

题目描述

输入格式

输出格式

样例输入

样例输出

样例说明

评测用例规模与约定

解法一:Map集合处理 

举个例子

Java写法:

C++写法:

运行时间

时间复杂度和空间复杂度

时间复杂度

空间复杂度

总结


题目链接:1.班级活动 - 蓝桥云课

注:下述题目描述和示例均来自蓝桥云客

题目描述

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

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

输入格式

输入共 22 行。

第一行为一个正整数 nn。

第二行为 nn 个由空格隔开的整数 a1,a2,...,ana1​,a2​,...,an​。

输出格式

输出共 11 行,一个整数。

样例输入

4
1 2 2 3

样例输出

1

样例说明

仅需要把 a1a1​ 改为 33 或者把 a3a3​ 改为 11 即可。

评测用例规模与约定

对于 20% 的数据,保证 n≤10^3。

对于 100% 的数据,保证 n≤10^5。



 

解法一:Map集合处理 

  1. 读取输入并统计数字出现次数
    使用 unordered_map 来记录每个数字的出现次数。我们遍历输入的 n 个数字,对于每个数字 num,在哈希表 map 中更新其出现次数。

    • 如果数字 num 已存在于 map 中,则增加其对应的计数值。
    • 如果 num 不存在,则将其加入 map,并将计数值初始化为1。
  2. 分类统计:确定多次出现和单次出现的情况
    遍历 map 中的每个键值对,统计出现次数的分布:

    • 超过两次出现的情况:如果一个数字的出现次数大于2次(即 map[num] > 2),则记下“超出2次的总数”。我们将这些多余的出现次数累加到 moreNum 中,因为这些多余的出现次数需要修改为其他数字以满足要求。

    • 等于一次出现的情况:如果一个数字的出现次数等于1次(即 map[num] == 1),则计数到 oneNum 中。这些一次出现的数字可以用于和“多次出现的数字”配对,使得不超过两次的条件得到满足。

  3. 计算最小修改次数
    根据 moreNumoneNum 的值,决定最小修改次数:

    • 情况1:如果多余次数 moreNum 已经大于或等于 oneNum,则这些多余次数的一部分可以和 oneNum 进行配对,使得这些出现一次的数字不需要修改,剩余的多余次数将直接计入修改次数。

    • 情况2:如果多余次数 moreNum 小于 oneNum,那么可以让 moreNum 的所有多余次数和 oneNum 的一部分配对。之后,剩余的 oneNum 还需要一半的数量修改为其他数字才能满足条件。

举个例子

假设我们有以下输入:3, 3, 3, 5, 5, 6

  • 第一步:统计出现次数,得到 map = {3: 3, 5: 2, 6: 1}

  • 第二步:遍历 map,得到 moreNum = 1(3出现了3次,超过了2次),oneNum = 1(6出现了1次)。

  • 第三步:根据 moreNumoneNum 的关系判断需要的修改次数。

    在这里,moreNumoneNum 相等,因此只需要 moreNum = 1 次修改,使得3的出现次数减少到2即可满足条件。

Java写法:

import java.util.*;
// 1:无需package
// 2: 类名必须Main, 不可修改public class Main {public static void main(String[] args) {Scanner sc = new Scanner(System.in);//在此输入您的代码...int n = sc.nextInt();Map<Integer,Integer> map = new HashMap<>();for(int i = 0;i < n;i++){// 将其对应出现的次数+1int num = sc.nextInt();map.put(num, map.getOrDefault(num, 0) + 1);}// 记录超过2的数量int moreNum = 0;// 记录超过1的数量int oneNum = 0;for(Integer value: map.values()){if(value > 2){// 超过了2两个moreNum += value - 2;}else if(value == 2){continue;}else{// 那就是一个oneNum++;}}// 如果比单独的多,那么就是moreNum的值,一部分用于和oneNum配对,剩下的两个都需要修改为其他的目标if(moreNum >= oneNum){System.out.print(moreNum);}else{//这种情况就是moreNum全和oneNum配对,然后剩余的oneNum的一半修改即可System.out.print(moreNum + (oneNum - moreNum)/2);}sc.close();}
}

C++写法:

#include <iostream>
#include <unordered_map>
using namespace std;int main() {int n;cin >> n;unordered_map<int, int> map;for(int i = 0; i < n; i++) {int num;cin >> num;map[num] += 1;}int moreNum = 0; // 记录超过2的数量int oneNum = 0;  // 记录仅出现1次的数量for(const auto& pair : map) {int value = pair.second;if(value > 2) {moreNum += value - 2; // 超过2次的部分计入moreNum} else if(value == 1) {oneNum++; // 仅出现1次的部分计入oneNum}}if(moreNum >= oneNum) {cout << moreNum;} else {cout << moreNum + (oneNum - moreNum) / 2;}return 0;
}

运行时间

时间复杂度和空间复杂度

时间复杂度

  1. 输入读取和统计出现次数:第一部分是用一个循环读取输入的 n 个整数,并统计每个数字的出现次数。这部分使用了一个哈希表 unordered_map,并在每次读取一个数字时执行 map[num] += 1 操作。由于哈希表的插入和查找操作的平均时间复杂度是 O(1),因此这部分的时间复杂度是 O(n)。

  2. 统计出现次数大于2和等于1的数字:第二部分对 unordered_map 的每个值进行一次遍历,统计出现次数大于2的数字和等于1的数字。因为哈希表中最多有 n 个不同的数字,这部分的时间复杂度也是 O(n)。

综上所述,总的时间复杂度为:

O(n)+O(n)=O(n)

空间复杂度

  1. 哈希表 unordered_map:用于存储每个数字的出现次数。在最坏情况下,如果所有的 n 个数字都不相同,哈希表中将包含 n 个键值对,因此其空间复杂度是 O(n)。

  2. 常数空间:程序中还使用了一些整数变量(如 moreNumoneNum)来记录特定统计信息,这些变量占用的空间是常数级别 O(1)。

因此,空间复杂度为:O(n)


 

总结

总结

        本文讨论了一个关于班级分组的问题,其中老师需要将偶数名同学进行两两配对,使得每两名同学的ID相同。

题目描述
  • 老师有n名(n为偶数)同学,并给每名同学分配了一个n以内的正整数ID。
  • 老师希望通过更改若干名同学的ID,使得对于任意一名同学i,有且仅有另一名同学j的ID与其相同。
  • 询问老师最少需要更改多少名同学的ID。
解法一:Map集合处理
  1. 步骤
    • 使用Map集合(如HashMap或UnorderedMap)来记录每个ID出现的次数。
    • 遍历所有同学的ID,更新Map中对应ID的计数。
    • 遍历Map,统计出现次数超过2次的ID的额外数量(moreNum,即超过2次的部分),以及只出现1次的ID数量(oneNum)。
    • 根据moreNum和oneNum的关系,计算最少需要更改的ID数量:
      • 如果moreNum >= oneNum,则直接输出moreNum,因为moreNum部分可以通过两两配对消耗掉,剩下的也可以用来配对oneNum部分,但不需要额外修改。
      • 如果moreNum < oneNum,则输出moreNum + (oneNum - moreNum) / 2,因为moreNum部分可以全部配对,剩下的oneNum部分需要两两配对,因此只需要修改剩余oneNum的一半数量。
  2. 时间复杂度和空间复杂度
    • 时间复杂度:O(n),其中n是同学的数量,因为我们需要遍历所有同学的ID两次(一次用于填充Map,一次用于统计moreNum和oneNum)。
    • 空间复杂度:O(n),因为Map集合在最坏情况下需要存储n个不同的ID及其计数。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/12486.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Win10下使用Anaconda安装GPU版本PyTorch

一、判断是否有Nvidia(英伟达)显卡 右键开始菜单&#xff0c;在弹出选项中选择任务管理器。 点性能选项&#xff0c;然后点GPU。在右上方会显示GPU名称&#xff0c;只有带NVIDIA的英伟达显卡的电脑才能安装GPU版本&#xff0c;否则其他的就只能安装CPU版本。 二、安装CUDA 首…

精品案例PPT | 企业架构及典型设计方案

本文全面介绍企业架构的理论和实践&#xff0c;包括企业架构的概述、元模型、视图、业务架构、应用架构、数据架构、技术架构以及企业架构管控等内容&#xff0c;有助于企业管理者理解和设计企业级的IT架构&#xff0c;确保架构的全局性、整体性、关联性、可控制性、可实现性和…

java--泛型

欢迎来到我的博客~~欢迎大家对我的博客进行指导~点击进入我的博客主页 目录 一、什么是泛型二、包装类2.1基本数据类型和对应的包装类2.2装箱和拆箱2.3 自动装箱和自动拆箱 三、引出泛型四、泛型类的使用4.1 语法4.2示例 五、泛型如何编译的六、泛型的上界6.1语法6.2 示例 七、…

【CentOS】中的Firewalld:全面介绍与实战应用(下)

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《Linux &#xff1a;从菜鸟到飞鸟的逆袭》&#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、引言 1、iptables 时代 2、firewalld 时代 二、服务管…

【新人系列】Python 入门(九):数据结构 - 中

✍ 个人博客&#xff1a;https://blog.csdn.net/Newin2020?typeblog &#x1f4dd; 专栏地址&#xff1a;https://blog.csdn.net/newin2020/category_12801353.html &#x1f4e3; 专栏定位&#xff1a;为 0 基础刚入门 Python 的小伙伴提供详细的讲解&#xff0c;也欢迎大佬们…

如何用【钉钉文档】发公告

功能亮点 ✔️借助钉钉文档强大的编辑能力&#xff0c;可以让编写出的公告更加精美。 ✔️将钉钉文档一键导入公告&#xff0c;可以完整保留已经编辑好的格式&#xff0c;无需再手动调整。 ✔️使用钉钉文档&#xff0c;可以将所有公告内容有序沉淀和保存。 &#x1f4a1; 使…

工位管理自动化:Spring Boot企业级工具

1系统概述 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及&#xff0c;互联网成为人们查找信息的重要场所&#xff0c;二十一世纪是信息的时代&#xff0c;所以信息的管理显得特别重要。因此&#xff0c;使用计算机来管理企业级工位管理系统的相关信息成为必然。开…

相亲小程序(源码+文档+部署+讲解)

最近我在挖掘一些优秀的开源项目时&#xff0c;无意间发现了一个相当给力的系统——相亲小程序管理系统。这个系统不仅功能实用&#xff0c;而且代码结构清晰&#xff0c;易于二次开发。作为一名技术爱好者&#xff0c;我觉得有必要把这个好东西推荐给我的读者们。接下来&#…

Filter and Search 筛选和搜索

Goto Data Grid 数据网格 Filter and Search 筛选和搜索 Filter Drop-down Menus (Excel-style) 筛选器下拉菜单&#xff08;Excel 样式&#xff09; 要调用列的筛选器下拉菜单&#xff0c;请单击列标题中的筛选器图标。在 “Values” 选项卡中&#xff0c;用户可以从 Data …

java项目报错:错误提示Could not initialize class com.jacob.com.ComThread

java项目报错&#xff1a;错误提示Could not initialize class com.jacob.com.ComThread 下载地址&#xff1a; 通过网盘分享的文件&#xff1a;jacob-1.19 链接: https://pan.baidu.com/s/1ouudh7A2-Y2kqPh_q-WYiA?pwdqhr3 提取码: qhr3 –来自百度网盘超级会员v7的分享 安…

Linux服务管理-多路径multipath

多路径Multipath 概述 多路径&#xff08;Multipath&#xff09;技术&#xff0c;特别是在存储系统中&#xff0c;是一种提高可靠性和性能的重要手段。多路径技术允许服务器通过多条物理路径连接到存储设备。这些路径可以是包含独立电缆、交换机和控制器的物理SAN连接。 多路…

省级绿色金融指数数据(1990-2021年)

绿色信贷是指银行在信贷业务中采纳环境标准&#xff0c;对污染企业的资金进行限制&#xff0c;同时对环保企业给予扶持。这种模式旨在促使贷款企业承担环境责任&#xff0c;实现节能减排&#xff0c;优化产业结构&#xff0c;以及改变经济增长方式。 1990-2021年省级绿色金融指…

【go从零单排】通道select、通道timeout、Non-Blocking Channel Operations非阻塞通道操作

&#x1f308;Don’t worry , just coding! 内耗与overthinking只会削弱你的精力&#xff0c;虚度你的光阴&#xff0c;每天迈出一小步&#xff0c;回头时发现已经走了很远。 &#x1f4d7;概念 select 语句是 Go 的一种控制结构&#xff0c;用于等待多个通道操作。它类似于 s…

Unity资源打包Addressable AA包

从零到一 很多资料都是通过一步步设置讲解的&#xff0c;有时很想先快速实现&#xff0c;再了解细节。 下面就是远程加载Cube.prefab然后实例化简单的代码。 代码中可以不需要远程的网址&#xff0c;不需要资源下载的位置&#xff0c;不需要判断是否已经下载到本地。 那是如…

Microsoft Visual C++ 安装失败 0x80070666

“0x80070666”错误通常在尝试安装 Microsoft Visual C、Lumberyard 或类似的分发包时发生。该错误信息通常在安装过程的开始阶段就被报告。此问题并非特定于某一Windows版本&#xff0c;已经确认在Windows 7、Windows 8.1和Windows 10中均会发生。 0x80070666 错误在安装 Micr…

netcat工具安装和使用

netcat是一个功能强大的网络实用工具&#xff0c;可以从命令⾏跨⽹络读取和写⼊数据。 netcat是为Nmap项⽬编写的&#xff0c;是⽬前分散的Netcat版本系列的经典。 它旨在成为可靠的后端⼯具&#xff0c;可⽴即为其他应⽤程序和⽤户提供⽹络连接。 一&#xff0c;下载安装 1&a…

带隙基准学习笔记一

1.带隙基准原理&#xff1a; 带隙基准电压源采用BJT&#xff0c;利用其基极-发射极电压的负温度系数和两个不同的BJT基极-发射极电压之差的正温度系数用于获得温度系数为零的基准电压源&#xff0c;因为最终计算的输出电压接近硅晶体的一个带隙电压&#xff0c;所以被称为带隙…

使用 Node.js 了解 MVC 模式

模型-视图-控制器 &#xff08;MVC&#xff09; 模式是 Web 开发中最流行的架构模式之一。通过将应用程序划分为三个相互关联的组件&#xff08;模型、视图和控制器&#xff09;&#xff0c;MVC 促进了有组织、可维护和可扩展的代码。Node.js 具有异步处理和庞大的生态系统&…

35.3K+ Star!PhotoPrism:一款基于AI的开源照片管理工具

PhotoPrism 简介 PhotoPrism[1] 是一个为去中心化网络设计的AI照片应用,它利用最新技术自动标记和查找图片,实现自动图像分类与本地化部署,你可以在家中、私有服务器或云端运行它。 项目特点 主要特点 浏览所有照片和视频,无需担心RAW转换、重复项或视频格式。 使用强大的…

VMware虚拟机安装Win7专业版保姆级教程(附镜像包)

一、Win7镜像下载: 链接&#xff1a;https://pan.baidu.com/s/1tvN9hXCVngUzpIC6b2OGrA 提取码&#xff1a;a66H 此镜像为Win7专业版(收藏级镜像 已自用几年)&#xff0c;官方纯净系统没有附带任何其他第三方软件。 二、配置虚拟机 1.创建新的虚拟机。 这里我们以最新的VMware…