分班问题 、幼儿园分班(C语言)
题目
幼儿园两个班的小朋友排队时混在了一起,每个小朋友都知道自己跟前面一个小朋友是不是同班,请你帮忙把同班的小朋友找出来
小朋友的编号为整数,与前面一个小朋友同班用Y
表示,不同班用N
表示
输入
输入为空格分开的小朋友编号和是否同班标志
比如 6/N 2/Y 3/N 4/Y
表示一共有4
位小朋友
2
和6
是同班,3
和2
不同班,4
和3
同班
小朋友总数不超过999
0 < 每个小朋友编号 < 999
不考虑输入格式错误
输出
每一行记录一班小朋友的编号 编号用空格分开
并且
- 编号需要按照大小升序排列,分班记录中第一个编号小的排在第一行
- 如果只有一个班的小朋友 第二行为空
- 如果输入不符合要求输出字符串
ERROR
示例一
输入
1/N 2/Y 3/N 4/Y
1
输出
1 2
3 4
12
说明
2
的同班标记为Y
因此和1
同班
3
的同班标记位N
因此和1
,2
不同班
4
的同班标记位Y
因此和3
同班
示例二
输入
1/N 2/Y 3/N 4/Y 5/Y
输出
1 2
3 4 5
思路
解题思路:
-
读取输入:首先通过
fgets
函数获取用户输入的一行字符串,然后使用strtok
函数将其按照空格分割成一个个包含编号和是否同班标志的token(例如:“1/N”、"2/Y"等),并将这些token存入临时数组中。 -
初始化学生结构体数组:根据临时数组中的信息,利用
sscanf
函数将每个token解析为小朋友的编号(id)和是否同班(isClass)标志,并存储到Students
结构体数组stu
中。 -
判断首位合法性:检查首位小朋友是否与前一位小朋友同班。由于没有前一位小朋友,若首位标记为“Y”,则输入非法,输出"ERROR"并结束程序。
-
分配班级:遍历整个
stu
数组,对于每个小朋友:- 首位小朋友直接划归到班级1;
- 若当前小朋友与前一位小朋友同班,则将其划归到前一位所在的班级;
- 若当前小朋友与前一位小朋友不同班,则将其划归到另一个班级。
在这个过程中,用两个整数数组
class1
和class2
分别记录两个班级的小朋友编号。 -
排序输出:对两个班级数组进行升序排序,这里使用C标准库提供的
qsort
函数进行快速排序。最后分别输出两个班级的小朋友编号,每个编号后面跟一个空格,第二个班级结束后输出换行符。
代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 1000// 定义学生结构体,包含小朋友编号(id)、是否同班标志(isClass)以及所在班级(classId)
typedef struct {int id;char isClass[2];int classId; // 表示小朋友属于一班还是二班
} Students;// 自定义排序函数,用于对整数数组进行升序排序
int cmp(const void *a, const void *b) { return *(int *)a - *(int *)b; }int main() {char input[3000]; // 输入缓冲区,用于存储用户输入的数据// 读取一行用户输入,并移除末尾换行符fgets(input, 3000, stdin);input[strcspn(input, "\n")] = '\0';// 使用strtok函数分割输入字符串为一个个token(小朋友编号和是否同班标志)char *token = strtok(input, " ");char tmp[MAX][10]; // 临时存储每个tokenint count = 0; // 记录当前读取到的token数量while (token != NULL) {strcpy(tmp[count++], token); // 将token复制到临时数组中token = strtok(NULL, " "); // 继续获取下一个token}// 初始化学生结构体数组,并将读取到的信息存入其中Students stu[MAX];for (int i = 0; i < count; i++) {sscanf(tmp[i], "%d/%s", &stu[i].id, stu[i].isClass);}// 检查首位小朋友是否与前一位小朋友同班(实际上没有前一位),若同班则输入非法,输出ERRORif (strcmp(stu[0].isClass, "Y") == 0) {printf("ERROR\n");return 0;}// 定义两个数组分别存储两个班级的小朋友编号int class1[MAX], class2[MAX];int count1 = 0, count2 = 0; // 分别记录两个班级的人数// 遍历所有小朋友信息,根据是否同班标志将他们分配到对应的班级数组中for (int i = 0; i < count; i++) {// 处理首位小朋友if (i == 0) {class1[count1++] = stu[i].id;stu[i].classId = 1; // 设置班级ID为1continue;}// 若当前小朋友与前一位小朋友同班,则将其划分到同一班级if (strcmp(stu[i].isClass, "Y") == 0) {stu[i].classId = stu[i - 1].classId;// 根据班级ID将小朋友编号添加到对应的班级数组中if (stu[i].classId == 1) {class1[count1++] = stu[i].id;} else if (stu[i].classId == 2) {class2[count2++] = stu[i].id;}}// 若当前小朋友与前一位小朋友不同班,则将其划分到另一个班级if (strcmp(stu[i].isClass, "N") == 0) {// 更新当前小朋友的班级ID,使其与前一位小朋友所在的班级不同if (stu[i - 1].classId == 1) {stu[i].classId = 2;} else if (stu[i - 1].classId == 2) {stu[i].classId = 1;}// 根据更新后的班级ID将小朋友编号添加到对应的班级数组中if (stu[i].classId == 1) {class1[count1++] = stu[i].id;} else if (stu[i].classId == 2) {class2[count2++] = stu[i].id;}}}// 对两个班级数组分别进行升序排序qsort(class1, count1, sizeof(int), cmp);qsort(class2, count2, sizeof(int), cmp);// 输出两个班级的小朋友编号,每个编号后面跟一个空格for (int i = 0; i < count1; i++) {printf("%d ", class1[i]);}printf("\n"); // 换行输出第二个班级for (int i = 0; i < count2; i++) {printf("%d ", class2[i]);}return 0;
}
文章目录
- 题目
- 输入
- 输出
- 示例一
- 输入
- 输出
- 说明
- 示例二
- 输入
- 输出
- 思路
- 代码
相关文章:

分班问题 、幼儿园分班(C语言)
题目 幼儿园两个班的小朋友排队时混在了一起,每个小朋友都知道自己跟前面一个小朋友是不是同班,请你帮忙把同班的小朋友找出来 小朋友的编号为整数,与前面一个小朋友同班用Y表示,不同班用N表示 输入 输入为空格分开的小朋友编号…...

QT 如何让多语言翻译变得简单,提高效率?
一.QT多语言如何翻译的? 在QT的多语言翻译过程中,分为两个步骤:第一步生成ts文件,第二步将ts文件翻译为qm文件。如果我们在需要多语言的情况下,qml经常使用qstr或者qwidget中使用tr等等,遍布许多个文件夹,在需要更新新的翻译时会很麻烦。整个工程收索并修改,效率十分低…...

线性代数:线性方程组解的结构
目录 齐次/非齐次方程组的解 Ax 0 的解的性质 定理 Ax b 的解的性质 相关证明 例1 例2 例3 齐次/非齐次方程组的解 Ax 0 的解的性质 定理 Ax b 的解的性质 相关证明 例1 例2 例3...

mysql之CRUD常见函数union查询
select select * from c insert 字段设置自增后,当我们指定增加一条数据后,往后增加的数据都会在该条数据后进行递增,但是可以认为的指定增加某条id不存在的数据 insert into c values(7,‘政治’) insert into c(c2) values(‘历史1’),(…...

开窗函数实践-实现两行记录之间计算时间差
一、需求背景 基于保密要求,不放原始表,新建测试表用来演示 insert into TEST0221 (采血人, 采血时间, 条码号, 病人ID) values (张三, to_date(21-02-2024 12:00:00, dd-mm-yyyy hh24:mi:ss), 2024001, 0001);insert into TEST0221 (采血人, 采血时间…...

String字符串的常见方法总结
目录 一、int length():返回字符串的长度 二、char charAt(int index):返回某索引处的字符 三、boolean isEmpty():判断字符串是否为空 四、String toUpperCase():将字符转换成大写 五、String toLowerCase():将字符转换成小写 六、String trim():去除首尾空白…...

Postgresql源码(122)Listen / Notify与事务的联动机制
前言 Notify和Listen是Postgresql提供的不同会话间异步消息通信功能,例子: LISTEN virtual; NOTIFY virtual; Asynchronous notification "virtual" received from server process with PID 8448. NOTIFY virtual, This is the payload; Asy…...

QT 数据库的增加操作和画图 Win
第一步、先配置CMakeLists.txt 在CMakeLists.txt中添加 find_package(Qt6 REQUIRED COMPONENTS Sql) find_package(Qt6 REQUIRED COMPONENTS Charts)target_link_libraries(${PROJECT_NAME} PRIVATE Qt6::Sql) target_link_libraries(${PROJECT_NAME} PRIVATE Qt6::Charts)避…...

【JS逆向学习】同花顺(q.10jqka)补环境
逆向目标 目标网址:https://q.10jqka.com.cn/ 目标接口: https://q.10jqka.com.cn/index/index/board/all/field/zdf/order/desc/page/3/ajax/1/ 目标参数:cookie 逆向过程 老规矩,先分析网络请求,发现是 cookie 加…...

解决MobaXterm网络错误连接超时问题
报错页面: 报错原因: ①网络断开了 ②网络端口,端口号改变 解决办法: ①重新连接网络按R ②固定端口号 第一步:编辑------>虚拟机网络编辑器(我的Linux在虚拟机里) 第二步:用…...

突发!AI独角兽「竹间智能」被曝停工停产6个月
大家好我是二狗。 今天早上起来刷朋友圈,看到一张截图——AI创企竹间智能,宣称因为公司所处的经营环境艰难,部分部门和岗位将从即日起停工停产6个月。 图源:(企服科学) 下面是文字版: 由于公司…...

Qt应用软件【协议篇】GPIO控制LED灯
GPIO简介 GPIO(General Purpose Input/Output,通用输入输出)是一种通用的端口定义,在各种计算机、嵌入式系统和微控制器中广泛应用。通过GPIO,计算机或微控制器可以与外部世界进行交互,例如读取传感器数据或控制外部设备(如LED灯、电机等)。 GPIO的应用场景 按钮和开…...

vulfocus靶场搭建
vulfocus靶场搭建 什么是vulfocus搭建教程靶场配置场景靶场编排靶场优化 什么是vulfocus Vulfocus 是一个漏洞集成平台,将漏洞环境 docker 镜像,放入即可使用,开箱即用,我们可以通过搭建该靶场,简单方便地复现一些框架…...

Swift基础知识:30.Swift访问控制
在 Swift 中,访问控制(Access Control)是一种用于限制代码模块对其他代码模块的访问权限的机制。通过访问控制,可以控制代码中各个部分的可见性和可访问性,以便于提高代码的安全性、可维护性和可复用性。 访问级别 S…...

ElasticSearch聚合操作
目录 ElasticSearch聚合操作 基本语法 聚合的分类 后续示例数据 Metric Aggregation Bucket Aggregation ES聚合分析不精准原因分析 提高聚合精确度 ElasticSearch聚合操作 Elasticsearch除搜索以外,提供了针对ES 数据进行统计分析的功能。聚合(aggregation…...

普中51单片机学习(定时器和计数器)
定时器和计数器 51单片机有两组定时器/计数器,因为既可以定时,又可以计数,故称之为定时器/计数器。定时器/计数器和单片机的CPU是相互独立的。定时器/计数器工作的过程是自动完成的,不需要CPU的参与。51单片机中的定时器/计数器是…...

having子句
目录 having子句 having和where的区别 Oracle从入门到总裁:https://blog.csdn.net/weixin_67859959/article/details/135209645 现在要求查询出每个职位的名称,职位的平均工资,但是要求显示平均工资高于 200 的职位 按照职位先进行分组,同…...

STM32H7 系列 MCU 内部 SRAM
通过参看《STM32H7 参考手册》“2.4 Embedded SRAM”章节知道 The STM32H743/53xx and STM32H750xB 内存特性: Up to 864 Kbytes of System SRAM 128 Kbytes of data TCM RAM 64 Kbytes of instruction TCM RAM 4 Kbytes of backup SRAM 1.1 TCM SRAM TCM : Tightly-Coupled …...

备战蓝桥杯---动态规划(应用2(一些十分巧妙的优化dp的手段))
好久不见,甚是想念,最近一直在看过河这道题(感觉最近脑子有点宕机QAQ),现在算是有点懂了,打算记录下这道又爱又恨的题。(如有错误欢迎大佬帮忙指出) 话不多说,直接看题&…...

从 git 分支中合并特定文件,而不是整个分支的内容
问题 在git 中,我们可以使用 git merge 命令,合并整个分支,覆盖当前分支的内容,但是有时候我们并不想这么做,而是想 merge 某个文件。那么下面提供两种办法。 方法一 使用 git checkout,从别的分支&#x…...

pycharm 远程运行报错 Failed to prepare environment
什么也没动的情况下,远程连接后运行是没问题的,突然在运行时就运行不了了,解决方案 清理缓存: 有时候 PyCharm 的内部缓存可能出现问题,可以尝试清除缓存(File > Invalidate Caches / Restart࿰…...

(十二)【Jmeter】线程(Threads(Users))之setUp 线程组
简述 操作路径如下: 作用:在正式测试开始前执行预加载或预热操作,为测试做准备。配置:设置预加载或预热操作的采样器、循环次数等参数。使用场景:确保在正式测试开始前应用程序已经达到稳定状态,减少测试结果的偏差。优点:提供预加载或预热操作,确保测试的准确性。缺…...

代码随想录算法训练营第二十五天|216.组合总和III,17.电话号码的字母组合
目录 216.组合总和II 17.电话号码的字母组合 216.组合总和II 如果把 组合问题理解了,本题就容易一些了。 题目链接/文章讲解:代码随想录 视频讲解:和组合问题有啥区别?回溯算法如何剪枝?| LeetCode:216.…...

c#创建安装windows服务
背景:最近在做设备数据对接采集时,遇到一些设备不是标准的Service-Client接口,导致采集的数据不够准确;比如设备如果中途开关机后,加工的数量就会从0开始重新计数,因此需要实时监控设备的数据,进行叠加处理;考略到工厂设备比较多,实时监听接口的数据为每秒3次,因此将…...

【JVM】打破双亲委派机制
📝个人主页:五敷有你 🔥系列专栏:JVM ⛺️稳中求进,晒太阳 打破双亲委派机制 打破双亲委派机制三种方法 自定义类加载器 ClassLoader包含了四个核心方法 //由类加载器子类实现,获取二进制数据调用…...

程序员要了解的AI基本知识
一.AI从业人员的三个层次 AI从业人员的层次是不同的,所以需要的知识面也是不同的。下面大致给出了3个层面。 1.学术研究者 他们的工作是从理论上诠释机器学习的各个方面,试图找出“这样设计模型/参数为什么效果更好”,并且为其他从业者提供…...

306_C++_QT_创建多个tag页面,使用QMdiArea容器控件,每个页面都是一个新的表格[或者其他]页面
程序目的是可以打开多个styles文件(int后缀文件),且是tag样式的(就是可以切多个页面出来,并且能够单独关闭);其中读取ini文件,将其插入到表格中的操作,也是比较复杂的,因为需要保持RGB字符串和前面的说明字符串对齐 ini文件举例: [MainMenu] Foreground\Selected=&…...

OpenCV笔记3:级联分类器实现人脸检测+绘制logo
OpenCV 人脸检测绘制logo 检测人脸绘制人脸区域绘制logo 寻找轮廓 二值图阈值 绘制轮廓 """ 绘制logo 1. 检测人脸区域如何检测到人脸眼睛、鼻子、嘴巴、眉毛、下巴等级联的过程OpenCV、Mediapipe、YOLOFace、DBFace等 2. 把logo粘贴在人脸上方 ""…...

python---Pixiv排行榜图片获取(2024.2.16)
1.提示: 使用需要安装各种import的包,都是很基础的包,直接安装即可。 自备梯子 。 切记把userid和cookie改为自己账号的参数! userid就是点击pixiv头像,网址后面一串数, cookie是打开排行榜后,…...

QT3作业
1 2. 使用手动连接,将登录框中的取消按钮使用qt4版本的连接到自定义的槽函数中,在自定义的槽函数中调用关闭函数,将登录按钮使用t5版本的连接到自定义的槽函数中,在槽函数中判断ui界面上输入的账号是否为"admin"&#…...