2023年03月 C/C++(五级)真题解析#中国电子学会#全国青少年软件编程等级考试
第1题:拼点游戏
C和S两位同学一起玩拼点游戏。有一堆白色卡牌和一堆蓝色卡牌,每张卡牌上写了一个整数点数。C随机抽取n张白色卡牌,S随机抽取n张蓝色卡牌,他们进行n回合拼点,每次两人各出一张卡牌,点数大者获得三颗巧克力,小者获得一颗巧克力,如果点数相同,每人各得二颗巧克力,使用过的卡牌不得重复使用。已知C和S取到的卡牌点数,请编程计算S最多和最少能得到多少颗巧克力。
时间限制:1000
内存限制:65536
输入
输入包含多组测试数据。 每组测试数据的第一行是一个整数n(1<=n<=1000),接下来一行是n个整数,表示C抽到的白色卡牌的点数,下一行也是n个整数,表示S抽到的蓝色卡牌的点数。 输入的最后以一个0表示结束。
输出
对每组数据,输出一行,内容是两个整数用空格格开,分别表示S最多和最少可获得的巧克力数。
样例输入
3
92 83 71
95 87 74
2
20 20
20 20
2
20 19
22 18
0
样例输出
9 5
4 4
4 4
下面是使用贪心算法实现的代码示例:
#include <stdio.h>
#include <stdlib.h>int compare(const void* a, const void* b) {return *(int*)b - *(int*)a; // 降序排序
}void playGame(int C[], int S[], int n, int* maxChocolates, int* minChocolates) {qsort(C, n, sizeof(int), compare); // 将C的卡牌按降序排序qsort(S, n, sizeof(int), compare); // 将S的卡牌按降序排序*maxChocolates = 0;*minChocolates = 0;int i = 0;int j = 0;while (i < n && j < n) {if (C[i] > S[j]) {*maxChocolates += 3;*minChocolates += 1;i++;j++;} else if (C[i] < S[j]) {*maxChocolates += 1;*minChocolates += 1;i++;j++;} else {*maxChocolates += 2;*minChocolates += 2;i++;j++;}}while (i < n) {*minChocolates += 1;i++;}while (j < n) {*maxChocolates += 3;*minChocolates += 1;j++;}
}int main() {int n;while (scanf("%d", &n) == 1 && n != 0) {int* C = (int*)malloc(sizeof(int) * n);int* S = (int*)malloc(sizeof(int) * n);for (int i = 0; i < n; i++) {scanf("%d", &C[i]);}for (int i = 0; i < n; i++) {scanf("%d", &S[i]);}int maxChocolates, minChocolates;playGame(C, S, n, &maxChocolates, &minChocolates);printf("%d %d\n", maxChocolates, minChocolates);free(C);free(S);}return 0;
}
这段代码使用贪心算法来计算S最多和最少能得到的巧克力数。首先实现了一个 compare()
函数,用于降序排序卡牌的点数。然后实现了 playGame()
函数,根据题目描述的规则进行游戏,计算S最多和最少能得到的巧克力数。在游戏过程中,通过比较C和S两人出的卡牌点数来决定巧克力的分配。最后,实现了主函数,根据题目要求的输入格式,循环读取多组测试数据,调用 playGame()
函数计算结果,并输出最多和最少的巧克力数。
这段代码实现了贪心算法,并根据题目描述的输入和输出格式进行了相应的处理。你可以将题目给出的示例输入复制到代码中进行测试。
第2题:数字变换
给定一个包含5个数字(0-9)的字符串,例如 “02943”,请将“12345”变换到它。 你可以采取3种操作进行变换
(1)交换相邻的两个数字
(2)将一个数字加1。如果加1后大于9,则变为0
(3)将一个数字加倍。如果加倍后大于9,则将其变为加倍后的结果除以10的余数。
最多只能用第2种操作3次,第3种操作2次 求最少经过多少次操作可以完成变换。
时间限制:1000
内存限制:65536
输入
有最多 100,000 组数据 每组数据就是包含5个数字的字符串
输出
对每组数据,输出将"12345"变换到给定字符串所需要的最少操作步数。如果无法变换成功,输出-1
样例输入
12435
99999
12374
样例输出
1
-1
3
提示
由于测试数据太多,如果对每组数据都从头进行搜索,就会超时。 建议先做预处理,即以“12345”作为初始状态做一遍彻底的广搜,找出“12345”经合法变换能够到达的所有字符串,并记录到达这些字符串各需要多少步操作。 然后对读入的每组数据,在上述预处理记录的结果中进行查询即可。
这个问题可以使用搜索剪枝技术来解决。下面是一个使用深度优先搜索(DFS)的示例代码,其中使用了剪枝来减少搜索空间:
#include <stdio.h>
#include <string.h>int minSteps = -1; // 最少操作步数,初始值为-1void dfs(char* str, int steps) {// 判断当前字符串是否为目标字符串"12345"if (strcmp(str, "12345") == 0) {if (minSteps == -1 || steps < minSteps) {minSteps = steps; // 更新最少操作步数}return;}// 如果已经超过最少操作步数或者超过操作限制次数,则剪枝返回if (minSteps != -1 && steps >= minSteps) {return;}// 对每个位置进行操作for (int i = 0; i < 5; i++) {// 操作1:交换相邻的两个数字if (i < 4) {char temp = str[i];str[i] = str[i+1];str[i+1] = temp;dfs(str, steps + 1);// 恢复字符串temp = str[i];str[i] = str[i+1];str[i+1] = temp;}// 操作2:将一个数字加1str[i] = (str[i] - '0' + 1) % 10 + '0';dfs(str, steps + 1);// 恢复字符串str[i] = (str[i] - '0' + 9) % 10 + '0';// 操作3:将一个数字加倍str[i] = (str[i] - '0') * 2 % 10 + '0';dfs(str, steps + 1);// 恢复字符串str[i] = (str[i] - '0' + 5) % 10 + '0';}
}int main() {char str[6];while (scanf("%s", str) == 1) {minSteps = -1;dfs(str, 0);printf("%d\n", minSteps);}return 0;
}
这段代码使用深度优先搜索(DFS)来遍历所有可能的操作序列。对于每个操作,首先判断当前字符串是否已经变为目标字符串 “12345”,如果是,则更新最少操作步数。然后判断是否满足剪枝条件:如果已经找到最少操作步数并且当前步数超过最少步数,则剪枝返回。接下来,按照操作要求进行交换、加1和加倍操作,并递归调用DFS函数。最后,在主函数中读取输入的字符串,调用DFS函数,并输出最少操作步数。
这段代码使用了搜索剪枝技术,通过减少搜索空间的大小,可以在给定的时间和内存限制下解决该问题。你可以将题目给出的示例输入复制到代码中进行测试。
第3题:打怪救公主
公主被魔王抓起来关在了迷宫的某处,骑士想要拯救公主,也进入了迷宫。
但是魔王不会轻易让骑士拯救公主,魔王在迷宫中安排了许多怪兽。
每个怪兽都有血量,骑士也有初始血量,骑士打败怪兽后血量的减少量为怪物的血量值,血量减到0,骑士会死去。
迷宫由m*n个方块组成,每个方块有墙或者路或者怪物,骑士在其中一个方块上,他每个时间单位可以四个方向(上、下、左、右)走到相邻方格,若遇到怪物,必须打败怪物才能继续前进。
请帮忙判断骑士能否成功拯救公主,如果能,给出骑士还剩的最大血量。
时间限制:1000
内存限制:65536
输入
第一行为三个整数m、n和t,t表示骑士的初始血量。(m,n <= 20, t <= 30) 第2至m+1行描述了迷宫,迷宫以m行n列的方格组成,若方格为".“则表示骑士可以通过,若方格为”#“则表示墙,骑士不能通过,若方格为数字则表示怪物,数字为怪物的血量,保证怪物的血量小于10(一位数)。”*“表示了骑士当前所在的位置,”+"表示公主被囚禁的位置。
输出
若骑士能成功拯救公主,则输出骑士走到公主所囚禁方格所剩最大血量,否则输出0。
样例输入
5 6 10
…*…
.#2###
5#…4#
.##9.#
.#+…#
样例输出
4
这个问题可以使用搜索剪枝技术来解决。下面是一个使用深度优先搜索(DFS)的示例代码:
#include <stdio.h>
#include <stdbool.h>int m, n, t; // 迷宫的行数、列数和骑士的初始血量
char maze[20][20]; // 迷宫
bool visited[20][20]; // 记录迷宫中的方块是否已经访问过int maxHealth = 0; // 骑士走到公主所剩最大血量// 判断当前位置是否合法
bool isValid(int x, int y) {return x >= 0 && x < m && y >= 0 && y < n && maze[x][y] != '#';
}// 深度优先搜索
void dfs(int x, int y, int health) {if (maze[x][y] == '+') {// 骑士成功拯救公主if (health > maxHealth) {maxHealth = health;}return;}visited[x][y] = true;// 上下左右四个方向移动int dx[4] = {-1, 1, 0, 0};int dy[4] = {0, 0, -1, 1};for (int i = 0; i < 4; i++) {int nx = x + dx[i];int ny = y + dy[i];if (isValid(nx, ny) && !visited[nx][ny]) {int newHealth = health - (maze[nx][ny] - '0');if (newHealth <= 0) {continue; // 骑士死亡,剪枝返回}dfs(nx, ny, newHealth);}}visited[x][y] = false; // 恢复状态
}int main() {scanf("%d %d %d", &m, &n, &t);int startX, startY; // 骑士的初始位置for (int i = 0; i < m; i++) {scanf("%s", maze[i]);for (int j = 0; j < n; j++) {if (maze[i][j] == '*') {startX = i;startY = j;}}}dfs(startX, startY, t);printf("%d\n", maxHealth);return 0;
}
这段代码使用深度优先搜索(DFS)来遍历迷宫中的所有可能路径。对于每个位置,首先判断是否为公主所在的位置,如果是,则更新骑士走到该位置时剩余的最大血量。然后判断当前位置是否合法,如果合法,则标记该位置为已访问,并继续在上、下、左、右四个方向进行移动。在每个方向上移动时,根据怪物的血量减少骑士的血量,并递归调用DFS函数。最后,在主函数中读取输入的迷宫信息,调用DFS函数,并输出骑士走到公主所在位置时所剩的最大血量。
这段代码使用了搜索剪枝技术,通过减少搜索空间的大小,可以在给定的时间和内存限制下解决该问题。你可以将题目给出的示例输入复制到代码中进行测试。
第4题:Freda的越野跑
Freda报名参加了学校的越野跑。越野跑共有N人参加,在一条笔直的道路上进行。这N个人在起点处站成一列,相邻两个人之间保持一定的间距。比赛开始后,这N个人同时沿着道路向相同的方向跑去。换句话说,这N个人可以看作x轴上的N个点,在比赛开始后,它们同时向x轴正方向移动。
假设越野跑的距离足够远,这N个人的速度各不相同且保持匀速运动,那么会有多少对参赛者之间发生“赶超”的事件呢?
时间限制:1000
内存限制:262144
输入
第一行1个整数N。 第二行为N 个非负整数,按从前到后的顺序给出每个人的跑步速度。 对于50%的数据,2<=N<=1000。 对于100%的数据,2<=N<=100000。
输出
一个整数,表示有多少对参赛者之间发生赶超事件。
样例输入
5
1 3 10 8 5
样例输出
7
提示
我们把这5个人依次编号为A,B,C,D,E,速度分别为1,3,10,8,5。 在跑步过程中: B,C,D,E均会超过A,因为他们的速度都比A快; C,D,E都会超过B,因为他们的速度都比B快; C,D,E之间不会发生赶超,因为速度快的起跑时就在前边。
这个问题可以使用贪心算法来解决。贪心算法是一种策略性的算法,每一步都选择当前最优解,以期望得到全局最优解。对于这个问题,我们可以观察到,一个人只能被速度更快的人超过,不能被速度较慢的人超过。因此,我们可以从最后一名参赛者开始,依次向前遍历,统计每个参赛者被超过的次数。
下面是一个使用贪心算法的示例代码:
#include <stdio.h>int main() {int N; // 参赛者的数量scanf("%d", &N);int speeds[N]; // 参赛者的速度for (int i = 0; i < N; ++i) {scanf("%d", &speeds[i]);}int count = 0; // 赶超事件的数量int maxSpeed = speeds[N - 1]; // 当前最大速度(从最后一名参赛者开始)for (int i = N - 2; i >= 0; --i) {if (speeds[i] > maxSpeed) {count++; // 当前参赛者被超过} else {maxSpeed = speeds[i]; // 更新最大速度}}printf("%d\n", count);return 0;
}
这段代码首先读取输入的参赛者数量N以及每个参赛者的速度。然后,通过从最后一名参赛者开始向前遍历的方式,统计每个参赛者被超过的次数。在遍历过程中,使用变量maxSpeed
记录当前最大速度,如果当前参赛者的速度大于maxSpeed
,则表示该参赛者被超过,将count
加1;否则,更新maxSpeed
为当前参赛者的速度。最后,输出count
作为赶超事件的数量。
你可以将题目给出的示例输入复制到代码中进行测试。
相关文章:

2023年03月 C/C++(五级)真题解析#中国电子学会#全国青少年软件编程等级考试
第1题:拼点游戏 C和S两位同学一起玩拼点游戏。有一堆白色卡牌和一堆蓝色卡牌,每张卡牌上写了一个整数点数。C随机抽取n张白色卡牌,S随机抽取n张蓝色卡牌,他们进行n回合拼点,每次两人各出一张卡牌,点数大者获…...

Android安卓实战项目(12)—关于身体分析,BMI计算,喝水提醒,食物卡路里计算APP【支持中英文切换】生活助手类APP(源码在文末)
Android安卓实战项目(12)—关于身体分析,BMI计算,喝水提醒,食物卡路里计算APP【支持中英文切换】生活助手类APP(源码在文末🐕🐕🐕) 一.项目运行介绍 B站演示…...

Hadoop 3.2.4 集群搭建详细图文教程
目录 一、集群简介 二、Hadoop 集群部署方式 三、集群安装 3.1 集群角色规划 3.2 服务器基础环境准备 3.2.1 环境初始化 3.2.2 ssh 免密登录(在 hadoop01 上执行) 3.2.3 各个节点上安装 JDK 1.8 环境 3.3 安装 Hadoop 3.4 Hadoop 安装包目…...
STL的学习之一
1)STL扫盲 1)C标准库和标准模板库是不一样的 2)标准模板库是用泛型编程方式编写的函数或者类库; 3) SGI STL linux一般用,P.J.Plauger STL,visual2017 windows用 STL六大组件 : 容器,迭代器 STL 算法(说白了就是函数…...
如何使用Python进行数据科学实验?
使用Python进行数据科学实验通常需要以下步骤: 以上仅为使用Python进行数据科学实验的基本步骤,具体实验过程会根据具体问题和数据集的特点而有所不同。可以进一步学习和探索相关的数据科学和机器学习技术,以提高实验的效果和表现。 安装Pyt…...

华为数通方向HCIP-DataCom H12-821题库(拖拽题,知识点总结)
以下是我在现有题库中整理的需要重点关注的考点内容,如有遗漏小伙伴可以留言补充。...
第三课:C++实现PDF去水印
PDF去水印是一项非常复杂的任务,需要一定的计算机图形学知识和技术,也需要使用到一些专业的工具库。以下是一种可能的实现方法: 首先,需要将PDF文件解析成一系列图形元素,包括文字、矢量图形等。可以使用开源库Poppler或MuPDF来解析PDF文件。 接下来,需要判断PDF文件是否…...
实现Android分布式协同办公:将待办事件App与本地Web服务结合
AndServer AndServer 是 Android 平台的 Web Server 和 Web Framework,它基于编译时注解提供了类似 SpringMVC 的注解和功能。 Github :https://github.com/yanzhenjie/AndServer使用文档:https://yanzhenjie.com/AndServer/业务需求 实现待办事件APP本地启动Web服务,将本…...

VMware12.1.1安装Centos7
VMware12.1.1安装Centos7 1、下载相关软件 1.1 Centos7下载 官方下载链接: http://isoredirect.centos.org/centos/7/isos/x86_64/CentOS-7-x86_64-DVD-1511.iso 1.2 VMware Workstation下载 VMware Workstation 12.1.1官方原版下载: https://dow…...

bazel构建原理
调度模型 传统构建系统有很多是基于任务的,例如 Ant,Maven,Gradle。用户可以自定义"任务"(Task),例如执行一段 shell 脚本。用户配置它们的依赖关系,构建系统则按照顺序调度。 基于 Task 的调度…...

matlab 点云的二进制形状描述子
目录 一、功能概述1、算法概述2、主要函数3、参考文献二、代码示例三、结果展示四、参数解析输入参数名称-值对应参数输出参数五、参考链接本文由CSDN点云侠原创,...

MongoDB实验——在Java应用程序中操作 MongoDB 数据
在Java应用程序中操作 MongoDB 数据 1. 启动MongoDB Shell 2. 切换到admin数据库,使用root账户 3.开启Eclipse,创建Java Project项目,命名为MongoJava File --> New --> Java Project 4.在MongoJava项目下新建包,包名为mo…...

java+springboot+mysql校园跑腿管理系统
项目介绍: 使用javaspringbootmysql开发的校园跑腿管理系统,系统包含超级管理员,系统管理员、用户角色,功能如下: 超级管理员:管理员管理;用户管理(充值);任…...
ubuntu20.04 server 安装后磁盘空间只有一半的处理
这里扩展:/dev/mapper/ubuntu–vg-ubuntu–lv rootbook:/data# df -h Filesystem Size Used Avail Use% Mounted on udev 3.9G 0 3.9G 0% /dev tmpfs 795M 1.2M 79…...
〔017〕Stable Diffusion 之 常用模型推荐 篇
✨ 目录 🎈 模型网站🎈 仿真系列🎈 国风系列🎈 卡通动漫系列🎈 3D系列🎈 一些好用的lora模型🎈 模型网站 由于现在大模型超级多,导致每种画风的模型太多,那么如何选择最好最适合的模型,成了很多人头疼的问题由于用的大部分都是1.5的模型,所以优先下载 safete…...

多目标应用:基于多目标人工蜂鸟算法(MOAHA)的微电网多目标优化调度MATLAB
一、微网系统运行优化模型 参考文献: [1]李兴莘,张靖,何宇,等.基于改进粒子群算法的微电网多目标优化调度[J].电力科学与工程, 2021, 37(3):7 二、多目标人工蜂鸟算法MOAHA 多目标人工蜂鸟算法(multi-objective artificial hummingbird algorithm&…...
【HTML5】HTML5 特性
HTML5 特性 1. 语义化标签 <header>:表示网页或某个区域的页眉部分,通常包含网站的标志、导航菜单等内容。<nav>:表示导航区域,用于包含网站的主要导航链接。<main>:表示网页的主要内容区域&#…...

【FreeRTOS】互斥量的使用与逐步实现
在FreeRTOS中,互斥量是一种用于保护共享资源的同步机制。它通过二进制信号量的方式,确保在任意时刻只有一个任务可以获取互斥量并访问共享资源,其他任务将被阻塞。使用互斥量的基本步骤包括创建互斥量、获取互斥量、访问共享资源和释放互斥量…...

Spring-Cloud-Openfeign如何传递用户信息?
用户信息传递 微服务系统中,前端会携带登录生成的token访问后端接口,请求会首先到达网关,网关一般会做token解析,然后把解析出来的用户ID放到http的请求头中继续传递给后端的微服务,微服务中会有拦截器来做用户信息的…...

OpenCV(十一):图像仿射变换
目录 1.图像仿射变换介绍 仿射变换: 仿射变换矩阵: 仿射变换公式: 2.仿射变换函数 仿射变换函数:warpAffine() 图像旋转:getRotationMatrix2D() 计算仿射变换矩阵:getAffineTransform() 3.demo 1.…...

stm32G473的flash模式是单bank还是双bank?
今天突然有人stm32G473的flash模式是单bank还是双bank?由于时间太久,我真忘记了。搜搜发现,还真有人和我一样。见下面的链接:https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...

《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》
引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...
【算法训练营Day07】字符串part1
文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接:344. 反转字符串 双指针法,两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...

从零实现STL哈希容器:unordered_map/unordered_set封装详解
本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说,直接开始吧! 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...

【C++特殊工具与技术】优化内存分配(一):C++中的内存分配
目录 一、C 内存的基本概念 1.1 内存的物理与逻辑结构 1.2 C 程序的内存区域划分 二、栈内存分配 2.1 栈内存的特点 2.2 栈内存分配示例 三、堆内存分配 3.1 new和delete操作符 4.2 内存泄漏与悬空指针问题 4.3 new和delete的重载 四、智能指针…...
NPOI Excel用OLE对象的形式插入文件附件以及插入图片
static void Main(string[] args) {XlsWithObjData();Console.WriteLine("输出完成"); }static void XlsWithObjData() {// 创建工作簿和单元格,只有HSSFWorkbook,XSSFWorkbook不可以HSSFWorkbook workbook new HSSFWorkbook();HSSFSheet sheet (HSSFSheet)workboo…...

论文阅读笔记——Muffin: Testing Deep Learning Libraries via Neural Architecture Fuzzing
Muffin 论文 现有方法 CRADLE 和 LEMON,依赖模型推理阶段输出进行差分测试,但在训练阶段是不可行的,因为训练阶段直到最后才有固定输出,中间过程是不断变化的。API 库覆盖低,因为各个 API 都是在各种具体场景下使用。…...

何谓AI编程【02】AI编程官网以优雅草星云智控为例建设实践-完善顶部-建立各项子页-调整排版-优雅草卓伊凡
何谓AI编程【02】AI编程官网以优雅草星云智控为例建设实践-完善顶部-建立各项子页-调整排版-优雅草卓伊凡 背景 我们以建设星云智控官网来做AI编程实践,很多人以为AI已经强大到不需要程序员了,其实不是,AI更加需要程序员,普通人…...
41道Django高频题整理(附答案背诵版)
解释一下 Django 和 Tornado 的关系? Django和Tornado都是Python的web框架,但它们的设计哲学和应用场景有所不同。 Django是一个高级的Python Web框架,鼓励快速开发和干净、实用的设计。它遵循MVC设计,并强调代码复用。Django有…...
【Ftrace 专栏】Ftrace 参考博文
ftrace、perf、bcc、bpftrace、ply、simple_perf的使用Ftrace 基本用法Linux 利用 ftrace 分析内核调用如何利用ftrace精确跟踪特定进程调度信息使用 ftrace 进行追踪延迟Linux-培训笔记-ftracehttps://www.kernel.org/doc/html/v4.18/trace/events.htmlhttps://blog.csdn.net/…...