PTA7-13 统计工龄

题目描述

给定公司 n 名员工的工龄,要求按工龄增序输出每个工龄段有多少员工。

输入格式:

输入首先给出正整数 n(≤105),即员工总人数;随后给出 n 个整数,即每个员工的工龄,范围在 [0, 50]。

输出格式:

按工龄的递增顺序输出每个工龄的员工个数,格式为:“工龄:人数”。每项占一行。如果人数为 0 则不输出该项。

输入样例:

8
10 2 0 5 7 2 5 2

输出样例:

0:1
2:3
5:2
7:1
10:1

题目分析 

首先,题目输入的是n个员工的工龄,每个工龄范围在0到50之间。输出需要按工龄递增的顺序,每个工龄的人数,如果人数为0就不输出。比如样例中的输入8个员工,工龄有10、2、0、5、7、2、5、2,输出的时候0出现1次,2出现3次,依此类推。

那怎么处理这个问题呢?首先,我想到的是,因为工龄的范围很小,只有0到50,所以可能不需要用普通的排序算法来处理。因为当数据范围有限的时候,计数排序(Counting Sort)可能是更高效的选择,尤其是当n很大的时候,比如题目中的n可以达到1e5,这时候计数排序的时间复杂度是O(n + k),其中k是工龄的范围,这里是51,所以总的时间复杂度是线性的,非常高效。

那具体来说,步骤应该是这样的:

1. 创建一个大小为51的数组count,用来统计每个工龄出现的次数。因为工龄的范围是0到50,所以数组下标0到50对应各个工龄,初始值都是0。

2. 遍历输入的工龄,对于每个工龄,对应的count数组的位置加1。

3. 遍历count数组,从0到50的顺序,如果某个位置的计数值大于0,就输出“工龄:人数”。

这样的话,整个过程的时间复杂度是O(n + 51),也就是O(n),对于n到1e5来说,完全没问题。而且空间上只需要一个固定大小的数组,所以空间复杂度也是O(1)的。

那这样的话,就不需要使用排序算法了,比如像上一题那样用标准库的sort函数。因为这里工龄的范围很小,用计数排序更高效。

那接下来需要考虑输入输出的问题。因为n可能很大,所以输入输出要尽量高效。C++中的cin和cout默认情况下可能比较慢,所以需要做一些优化。比如,可以关闭同步,使用更快的输入输出方式。比如用:

ios::sync_with_stdio(false);

cin.tie(nullptr);

这样可以加速输入输出。另外,在读取n个整数的时候,应该用循环逐个读入,然后统计到count数组中。

比如,输入样例中的情况,当输入8个数时,遍历每个数,比如第一个是10,那么count[10]++,第二个是2,count[2]++,依此类推。这样统计结束后,count数组中各个位置的值就是对应的工龄出现的次数。

然后,遍历count数组,从0到50,对于每个i,如果count[i] > 0,就输出i << ":" << count[i] << endl。

这样就能得到正确的结果。

那现在需要考虑的是,如何处理输入中的数字?比如,输入可能有多个空格分隔的数字,可以用cin逐个读取。因为n的值可能很大,但每个工龄都是整数,所以用int类型存储足够。

那代码的大致结构应该是:

- 读取n。

- 初始化count数组为0。

- 循环n次,读取每个工龄,然后count[工龄]++。

- 遍历count数组,输出非零的项。

这样实现的话,非常简洁高效。

那测试一下样例输入是否正确。比如输入样例中的工龄是10、2、0、5、7、2、5、2。统计后:

count[0] =1,count[2]=3,count[5]=2,count[7]=1,count[10]=1。其他如1、3、4等的count都是0,所以不输出。按顺序遍历时,0到10中,这些非零的位置会被正确输出。

那这样应该就能解决问题了。而且无论n有多大,只要工龄范围固定,这个方法都是线性的时间,不会有性能问题。比如当n是1e5的时候,这个方法依然很快。

那代码实现的话,需要注意数组的大小。因为工龄可以到50,所以数组大小应该是51,索引从0到50。例如,工龄50对应count[50]。

另外,在C++中,数组初始化的时候,可以用int count[51] = {0}; 这样所有元素都会被初始化为0。

然后,读取每个数的时候,可能需要注意输入的数值是否在0到50之间。但题目中已经说明输入的工龄范围在[0,50],所以不需要处理越界的情况,可以放心读取。

综上,这个思路应该是正确的。现在把这个思路转化为C++代码。

代码步骤:

1. 关闭同步,加速输入输出。

2. 读取n。

3. 创建count数组,初始化为0。

4. 循环n次,读取每个数x,count[x]++。

5. 遍历count数组,输出非零的元素。

那代码的大概样子是:

#include <iostream>

using namespace std;

int main() {

ios::sync_with_stdio(false);

cin.tie(nullptr);

int n;

cin >> n;

int count[51] = {0}; // 初始化为0

for (int i = 0; i < n; ++i) {

int x;

cin >> x;

count[x]++;

}

for (int i = 0; i <= 50; ++i) {

if (count[i] > 0) {

cout << i << ":" << count[i] << "\n";

}

}

return 0;

}

这样应该就可以了。测试一下样例输入:

输入是8,然后是8个数。按照代码处理之后,count数组中的正确位置会被统计。然后遍历输出,符合条件的结果就会被正确打印。

需要注意的是,输出的时候,每个输出项占一行,格式是“工龄:人数”。比如0:1,后面换行。

在代码中,使用cout << i << ":" << count[i] << "\n"; 是正确的。而使用endl的话,可能会因为频繁的刷新缓冲区而变慢,所以使用\n更高效。这里因为已经关闭了同步,所以用\n应该没问题。

所以,这个代码应该可以正确解决问题,并且高效处理所有测试数据,包括最大的n=1e5的情况。比如,对于数据6、7、8、9的情况,这个方法的时间复杂度都是O(n),所以不会有问题。

方法思路

本题要求统计员工工龄的出现次数并按工龄升序输出。由于工龄范围固定(0~50),采用计数排序思想最为高效。具体步骤如下:

  1. 计数统计:创建一个大小为51的数组,遍历输入数据,统计每个工龄出现的次数。

  2. 结果输出:遍历计数数组,输出非零的工龄及其出现次数。

代码实现 

#include <iostream>
using namespace std;int main() {// 关闭同步,加速输入输出ios::sync_with_stdio(false);cin.tie(nullptr);int n;cin >> n;int count[51] = {0}; // 初始化工龄计数器数组,范围0~50// 读取每个工龄并更新计数器for (int i = 0; i < n; ++i) {int age;cin >> age;count[age]++;}// 按工龄递增顺序输出结果for (int i = 0; i <= 50; ++i) {if (count[i] > 0) {cout << i << ":" << count[i] << "\n";}}return 0;
}

代码解释

  1. 输入输出优化

    • ios::sync_with_stdio(false); 和 cin.tie(nullptr); 用于关闭C++标准流与C标准流的同步,显著提升输入输出速度。

  2. 计数统计

    • 定义数组 count[51] 并初始化为0,用于记录0~50岁工龄的出现次数。

    • 循环读取每个员工的工龄,并在对应的 count 数组位置加1。

  3. 结果输出

    • 遍历 count 数组,仅输出出现次数大于0的工龄及其人数,格式为“工龄:人数”。

    • 使用 "\n" 代替 endl 以提高输出效率,避免频繁刷新缓冲区。

此方法时间复杂度为 O(n),适用于大数据量,能够高效处理题目中的各种测试情况。

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【 <一> 炼丹初探:JavaWeb 的起源与基础】之 Servlet 3.0 新特性:异步处理与注解配置

<前文回顾> 点击此处查看 合集 https://blog.csdn.net/foyodesigner/category_12907601.html?fromshareblogcolumn&sharetypeblogcolumn&sharerId12907601&sharereferPC&sharesourceFoyoDesigner&sharefromfrom_link <今日更新> 一、Servle…

电子电气架构 --- 汽车电子硬件架构

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 人生是一场骗局,最大的任务根本不是什么买车买房,也不是及时行乐,这就是欲望,不是理想,是把自己对生命的希望寄托在外物上,正确的做法应该是内…

使用 Homebrew 安装 OpenJDK 并配置环境变量

在 macOS 上使用 Homebrew 安装 OpenJDK 是一种简单而高效的方式。本文将使用 Homebrew 安装 OpenJDK&#xff0c;并设置环境变量以便 Java 能够正确运行。 1. 安装 Homebrew 首先&#xff0c;确保你的 macOS 系统已经安装了 Homebrew。如果没有安装&#xff0c;可以通过以下…

Java集合简单理解

Java 的集合框架&#xff08;Java Collections Framework, JCF&#xff09;是 Java 中用于存储和操作数据结构的核心库&#xff0c;提供了丰富的接口和实现类&#xff0c;用于处理不同类型的集合数据。以下是详细的介绍&#xff1a; 一、集合框架的体系结构 Java 集合主要分为…

群体智能优化算法-旗鱼优化算法 (Sailfish Optimizer, SFO,含Matlab源代码)

摘要 旗鱼优化算法&#xff08;Sailfish Optimizer, SFO&#xff09;是一种模拟旗鱼&#xff08;Sailfish&#xff09;和沙丁鱼&#xff08;Sardine&#xff09;之间捕食关系的新型元启发式算法。通过在搜索过程中模拟旗鱼对沙丁鱼的捕食行为&#xff0c;以及沙丁鱼群的逃逸与…

【C语言】编译和链接详解

hi&#xff0c;各位&#xff0c;让我们开启今日份博客~ 小编个人主页点这里~ 目录 一、翻译环境和运行环境1、翻译环境1.1预处理&#xff08;预编译&#xff09;1.2编译1.2.1词法分析1.2.2语法分析1.2.3语义分析 1.3汇编1.4链接 2.运行环境 一、翻译环境和运行环境 在ANSI C…

VIC模型率定验证

在气候变化问题日益严重的今天&#xff0c;水文模型在防洪规划&#xff0c;未来预测等方面发挥着不可替代的重要作用。目前&#xff0c;无论是工程实践或是科学研究中都存在很多著名的水文模型如SWAT/HSPF/HEC-HMS等。虽然&#xff0c;这些软件有各自的优点&#xff1b;但是&am…

【AWS入门】AWS云计算简介

【AWS入门】AWS云计算简介 A Brief Introduction to AWS Cloud Computing By JacksonML 什么是云计算&#xff1f;云计算能干什么&#xff1f;我们如何利用云计算&#xff1f;云计算如何实现&#xff1f; 带着一系列问题&#xff0c;我将做一个普通布道者&#xff0c;引领广…

Flutter_学习记录_ ImagePicker拍照、录制视频、相册选择照片和视频、上传文件

插件地址&#xff1a;https://pub.dev/packages/image_picker 添加插件 添加配置 android无需配置开箱即用&#xff0c;ios还需要配置info.plist <key>NSPhotoLibraryUsageDescription</key> <string>应用需要访问相册读取文件</string> <key>N…

蓝桥与力扣刷题(蓝桥 星期计算)

题目&#xff1a;已知今天是星期六&#xff0c;请问 20^22 天后是星期几? 注意用数字 1 到 7 表示星期一到星期日。 本题为填空题&#xff0c;只需要算出结果后&#xff0c;在代码中使用输出语句将所填结果输出即可。 解题思路&#xff0b;代码&#xff1a; 代码&#xff1…

向量数据库原理及选型

向量数据库 什么是向量什么是向量数据库原理应用场景 向量数据库的选型主流向量数据库介绍向量数据库对比主流向量数据库对比表 选型建议 什么是向量 向量是一组有序的数值&#xff0c;表示在多维空间中的位置或方向。向量通常用一个列或行的数字集合来表示&#xff0c;这些数…

以实现生产制造、科技研发、人居生活等一种或多种复合功能的智慧油站开源了

AI视频监控平台简介 AI视频监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒&#xff0c;省去繁琐重复的适配流程&#xff0c;实现芯片、算法、应用的全流程组合&#xff0c;从而大大减少企业级应用约95%的开发成本。用…

小程序网络大文件缓存方案

分享一个小程序网络大图加载慢的解决方案 用到的相关api getSavedFileList 获取已保存的文件列表&#xff1b;getStorageSync 获取本地缓存&#xff1b;downloadFile 下载网络图片&#xff1b;saveFile 保存文件到本地&#xff1b;setStorage 将数据储存到小程序本地缓存&…

软考系统架构师 — 3 操作系统

目录 3.1 考点分析 3.1 操作系统概述 3.1.1 操作系统的功能 3.1.2 操作系统的分类 3.1.3 嵌入式操作系统主要特点 3.2 进程 3.2.1 进程的组成和状态 3.2.2 前趋图与进程资源图&#xff08;重点&#xff09; 3.2.3 进程同步与互斥 3.2.4 进程调度 3.2.5 死锁 3.3 线…

PE,ELF,COFF

本文来自 (1)腾讯元宝 (2)程序员的自我修养 PE&#xff08;Portable Executable&#xff09;是一种文件格式&#xff0c;主要用于Windows操作系统中的可执行文件&#xff08;如.exe、.dll、.sys等&#xff09;。PE格式是Windows操作系统中标准的可执行文件格式&#xff0c;由…

MySQL 在 CentOS 7 上安装的步骤指南

目录 1. 卸载不需要的环境 2. 获取 MySQL YUM 仓库 3. 安装 MySQL 4. 启动 MySQL 服务 5. 获取临时 Root 密码 6. 登录 MySQL 7. 更改 Root 密码 8. 设置 MySQL 开机自启动 9. 配置 MySQL 编码 10. 重启 MySQL 配置生效 11. 常见问题解决 1. 卸载不需要的环境 如果…

C++初阶——类和对象(三) 构造函数、析构函数

C初阶——类和对象&#xff08;三&#xff09; 上期内容&#xff0c;我们围绕类对象模型的大小计算&#xff0c;成员存储方式&#xff0c;this指针&#xff0c;以及C实现栈和C语言的比较&#xff0c;进一步认识了C的封装特性。本期内容&#xff0c;我们开始介绍类的默认成员函…

【NLP】 5. Word Analogy Task(词类比任务)与 Intrinsic Metric(内在度量)

Word Analogy Task&#xff08;词类比任务&#xff09; 定义&#xff1a;Word Analogy Task 是用于评估词向量质量的内在指标&#xff08;Intrinsic Metric&#xff09;。该任务基于这样的假设&#xff1a;如果词向量能够捕捉单词之间的语义关系&#xff0c;那么这些关系应该能…

矩阵幂(矩阵k次幂)

矩阵幂 #include<stdio.h> //矩阵乘法 void cf(int a[20][20],int b[20][20],int result[20][20],int n){for(int i0;i<n;i){for(int j0;j<n;j){result[i][j]0;for(int k0;k<n;k){result[i][j]a[i][k]*b[k][j];}}} }void print(int a[20][20],int n){for(int…