image

编辑人: 未来可期

calendar2025-06-11

message2

visits883

第13届蓝桥杯C++青少组_国赛_中/高级组_2022年5月29日真题答案及解析

一、单选题

1、在C++语言中,char类型数据占(  )字节。

A 1

B 2

C 4

D 8

解析:【喵呜刷题小喵解析】:在C++语言中,char类型数据通常占1个字节。这是因为在计算机中,字节是最基本的存储单位,而char类型数据通常被用来存储ASCII字符,每个ASCII字符占用1个字节。因此,正确答案是A,即char类型数据占1个字节。

2、已知:int x = 3; int y = 2; 执行语句cout << (x -= y, x *= y+7/5); 后输出的结果是(  )。

A 1

B 3

C 5

D 7

解析:【喵呜刷题小喵解析】首先,我们需要理解表达式`x -= y, x *= y+7/5`。这是一个逗号表达式,由两个表达式组成,用逗号分隔。逗号表达式的求值顺序是从左到右。

1. `x -= y`:这个表达式会先执行。`x -= y`等同于`x = x - y`,所以`x`的值会变成`3 - 2 = 1`。
2. `x *= y+7/5`:由于整数除法`7/5`的结果是1,所以`y+7/5`的结果是`2+1=3`。接着,`x *= 3`等同于`x = x * 3`,此时`x`的值会变成`1 * 3 = 3`。

最后,`cout << (x -= y, x *= y+7/5);`的输出结果是`x`的最终值,即`3`。

所以,正确答案是B,即`3`。

3、以下选项中,哪一个是面向对象程序设计中的程序组成单元(   ) 。

A

B 语句

C 子函数

D 主函数

解析:【喵呜刷题小喵解析】:在面向对象程序设计(OOP)中,类是程序的基本组成单元。类是对象的抽象表示,它定义了对象的属性和行为。类是创建对象的模板,通过类可以创建多个具有相同属性和行为的对象实例。因此,选项A“类”是面向对象程序设计中的程序组成单元。

4、在编写程序时,使用重载函数的目的是(  )。

A 节省存储空间

B 共享程序代码

C 提高程序运行效率

D 使用相同函数名调用功能相似函数

解析:【喵呜刷题小喵解析】:在编写程序时,使用重载函数的目的是使用相同函数名调用功能相似函数。重载函数允许使用相同的函数名,但具有不同的参数列表(参数类型、参数个数或参数顺序),从而可以执行不同的操作。这样可以提高代码的可读性和可维护性,同时避免使用冗长的函数名。节省存储空间、共享程序代码和提高程序运行效率都不是使用重载函数的主要目的。因此,正确选项是D。

5、以下选项中描述不正确的是(  )。

A 循环队列属于线性表

B 二叉链表是二叉树的存储结构

C 带链的队列是队列的一种存储结构

D 循环链表是循环队列的一种存储结构

解析:【喵呜刷题小喵解析】
选项A描述正确,循环队列属于线性表。线性表是一种数据结构,它包含一系列的元素,这些元素按照特定的顺序排列。循环队列是线性表的一种特殊形式,它使用循环数组来实现。

选项B描述正确,二叉链表是二叉树的存储结构。二叉树是一种树形结构,其中每个节点最多有两个子节点。二叉链表是二叉树的一种存储方式,它使用链表来存储二叉树的节点。

选项C描述正确,带链的队列是队列的一种存储结构。队列是一种先进先出(FIFO)的数据结构,它允许元素在一端(rear)添加,在另一端(front)删除。带链的队列是队列的一种存储方式,它使用链表来实现队列的存储。

选项D描述不正确,循环链表并不是循环队列的一种存储结构。循环链表是一种链表,其中最后一个节点的指针指向第一个节点,形成一个循环。而循环队列是一种使用循环数组实现的线性表,它们有本质的区别。

因此,描述不正确的是选项D。

二、实操题

6、电线上的小鸟

题目描述:

在一根电线上落有N只小鸟,有的小鸟头向左看,有的小鸟头向右看,且每只小鸟只能看到它视线前的那一只小鸟。

给定N只小鸟头的朝向,头向左看的小鸟使用小写字母“q”表示,头向右看的小鸟用小写字母“p”表示,请你计算出N只小鸟中有多少只小鸟被0只小鸟看到,多少只小鸟被1只小鸟看到,多少只小鸟被2只小鸟看到。 

例如:N=6,6只小鸟头的朝向分别为p,q,p,p,q,q。

如图:有2只小鸟被0只小鸟看到(第3只和第6只);有2只小鸟被1只小鸟看到(第1只和第2只);有2只小鸟同时被2只小鸟看到(第4只和第5只),则输出三个数字分别为2,2,2。

时间限制: 1000MS

内存限制: 65536KB

输入描述

第一行输入一个正整数N(3≤N≤1000),表示有N只小鸟落在电线上

第二行输入N个字符,字符只能为“q”和“p”,“q”表示小鸟头向左看,“p”表示小鸟头向右看,字符之间以一个空格隔开

输出描述

一行输出三个整数,分别为有几只小鸟被0只小鸟看到;有几只小鸟被1只小鸟看到;有几只小鸟被2只小鸟看到;整数之间以一个空格隔开


样例输入

6
p q p p q q

样例输出

2 2 2

参考答案:4 2 0

解析:【喵呜刷题小喵解析】:
首先,我们需要理解题目中的小鸟朝向和它们被看到的情况。

小鸟的朝向只有两种:头向左看(用'q'表示)和头向右看(用'p'表示)。

当小鸟头向左看时,它只能看到它前面的那只小鸟(如果有的话),即头向右看的小鸟。
当小鸟头向右看时,它也只能看到它前面的那只小鸟(如果有的话),即头向左看的小鸟。

根据题目描述,我们需要计算三种情况的小鸟数量:

1. 被0只小鸟看到的小鸟:这种小鸟的前面没有小鸟,即它是第一只小鸟,且它的朝向是'q'。
2. 被1只小鸟看到的小鸟:这种小鸟的前面有一只小鸟,且它的朝向与前面小鸟的朝向相反。
3. 被2只小鸟看到的小鸟:这种小鸟的前面有两只小鸟,且它的朝向与前面两只小鸟的朝向都相反。

对于样例输入:6
p q p p q q

我们可以这样分析:

* 第一只小鸟(p)被0只小鸟看到,因为它前面没有小鸟。
* 第二只小鸟(q)被1只小鸟看到,即第一只小鸟(p)。
* 第三只小鸟(p)被0只小鸟看到,因为它前面没有小鸟。
* 第四只小鸟(p)被2只小鸟看到,即第二只和第三只小鸟(q和p)。
* 第五只小鸟(q)被2只小鸟看到,即第四只和第六只小鸟(p和q)。
* 第六只小鸟(q)被1只小鸟看到,即第五只小鸟(q)。

所以,根据这个分析,输出应该是:4 2 0。即被0只小鸟看到的小鸟有4只,被1只小鸟看到的小鸟有2只,被2只小鸟看到的小鸟有0只。

7、报数游戏

题目描述:

某班级男生人数为X人,女生人数为Y人,现全班同学围成一个圆圈,并按照顺时针方向为每名同学编号(从1到X+Y)。现给出一个正整数K【2<K<(X+Y)】,从编号为1的同学开始顺时针方向报数,报到K的同学退出圆圈,下一名同学继续从1报数,再次报到K的同学退出圆圈。如此循环,直到剩余人数为X时游戏结束。

请你计算出游戏开始时X名男生分别应该排在什么位置,才能保证每次离开的都是女生,游戏结束时剩余X人都是男生。并将游戏开始时每名男生的位置编号按照从小到大顺序输出。

例如:X=5,Y=3,K=3,8名同学按照如下顺序排列,可以使3轮报数过后最后剩余的5名同学都为男生(蓝色为男生位置,红色为女生位置)。

故5名男同学的编号分别为2,4,5,7,8。

输入描述

输入三个正整数X,Y,K(3≤X≤100,3≤Y≤100,2<K<(X+Y)),X表示男生人数,Y表示女生人数,报数为K的同学退出圆圈,三个正整数之间以一个空格隔开

输出描述

将每名男生位置编号按照从小到大的顺序输出,编号之间以一个空格隔开

样例输入

5 3 3

样例输出

2 4 5 7 8

参考答案:由于题目要求输出每名男生的位置编号,我们可以按照题目描述进行模拟。首先,根据输入的男生人数X和女生人数Y,计算出总人数N=X+Y。然后,按照顺时针方向为每名同学编号,从1到N。接着,从编号为1的同学开始报数,每次报到K的同学退出圆圈,下一名同学继续从1报数,直到剩余人数为X时游戏结束。在模拟过程中,我们需要记录每次退出圆圈的同学的编号,并判断其性别。如果退出的同学是女生,则保留其编号;如果退出的同学是男生,则跳过。最后,将剩余的男生编号按照从小到大的顺序输出。

解析:【喵呜刷题小喵解析】:
本题是一道模拟题,需要按照题目描述进行模拟。首先,根据输入的男生人数X和女生人数Y,计算出总人数N=X+Y。然后,按照顺时针方向为每名同学编号,从1到N。接着,从编号为1的同学开始报数,每次报到K的同学退出圆圈,下一名同学继续从1报数,直到剩余人数为X时游戏结束。在模拟过程中,我们需要记录每次退出圆圈的同学的编号,并判断其性别。如果退出的同学是女生,则保留其编号;如果退出的同学是男生,则跳过。最后,将剩余的男生编号按照从小到大的顺序输出。

在模拟过程中,我们可以使用一个数组来记录每名同学的编号和性别,以及一个计数器来记录当前剩余的同学人数。每次报到K的同学退出圆圈时,我们将其编号和性别记录在数组中,并更新计数器。如果退出的同学是女生,则保留其编号;如果退出的同学是男生,则跳过。最后,我们遍历数组,将剩余的男生编号按照从小到大的顺序输出。

需要注意的是,题目中给出的样例输入和样例输出只是一个特殊情况,我们需要根据题目描述进行一般情况的模拟。另外,由于题目中给出的输入范围较大,我们需要使用高效的数据结构和算法来解决问题。在本题中,我们可以使用数组来记录每名同学的编号和性别,以及使用计数器来记录当前剩余的同学人数。这样可以保证算法的时间复杂度和空间复杂度都是线性的,满足题目要求。

8、最少问题

题目描述:

河面上有N个木桩排成一排,且每个木桩上都有一个数字,木桩上的数字表示青蛙从当前木桩一次最多可跳跃的木桩个数(例如木桩上的数字为2,青蛙可以跳跃一个木桩也可以跳跃两个木桩)。请你帮助青蛙计算出从第一个木桩跳跃到最后一个木桩最少需要跳跃几次。

例如:N=5,5个木桩上的数字分别为2,1,5,1,3。

第一次跳跃,青蛙从第一个木桩跳跃到第三个木桩,共跳了2个木桩;

第二次跳跃,青蛙从第三个木桩跳跃到最后一个木桩,共跳了2个木桩;

故最少需要跳跃2次可到达最后一个木桩 。

输入描述

第一行输入一个正整数N(5≤N≤100),N表示河面上的木桩个数

第二行输入N个正整数(1≤正整数≤1000),表示每个木桩上的数字,正整数之间以一个空格隔开(输入的正整数顺序为木桩的排列顺序,第一个正整数为第一个木桩上的数字)

输出描述

输出一个整数,表示青蛙最少需要跳跃几次可到达最后一个木桩

样例输入

5
2 1 5 1 3

样例输出

2

参考答案:```#include #include #include using namespace std;int main() int N;cin >> N;vector nums(N);for (int i = 0; i < N; i++) {cin >> nums[i];}int max_jumps = 0;int curr_jumps = 0;int curr_pos = 0;while (curr_pos < N - 1) {int next_pos = curr_pos + nums[curr_pos];if (next_pos >= N - 1) {max_jumps++;curr_pos = N - 1;} else {int min_jumps = nums[curr_pos] + 1;for (int i = curr_pos + 1; i <= min(curr_pos + nums[curr_pos], N - 1); i++) {min_jumps = min(min_jumps, nums[i] + 1);}curr_jumps += min_jumps;max_jumps = max(max_jumps, curr_jumps);curr_pos = next_pos;}}cout << max_jumps << endl;return 0;```

解析:【喵呜刷题小喵解析】:
该题是一个动态规划的问题,我们定义dp[i]为到达第i个木桩最少需要跳跃的次数,dp[N-1]即为所求。

我们可以从第一个木桩开始,逐步计算dp[i]。对于每个木桩i,我们可以从前面的木桩j跳跃过来,其中j的最大值为i-nums[i]。我们需要找到这样一个j,使得dp[j] + 1最小,因为青蛙从j跳跃到i需要跳跃一次。

因此,我们可以使用双指针的方法,一个指针j从i-nums[i]开始向前移动,另一个指针i从i开始向前移动。当i和j相遇时,我们找到了一个可以跳跃到i的木桩j,此时dp[i] = dp[j] + 1。

最后,我们只需要找到dp[N-1]即可。

在上面的代码中,我们使用了双指针的方法,其中curr_pos表示当前木桩的位置,next_pos表示从curr_pos跳跃后能够到达的最远位置。如果next_pos大于等于N-1,说明青蛙可以直接跳跃到最后一个木桩,此时max_jumps加1,curr_pos更新为N-1。否则,我们需要找到从curr_pos跳跃到next_pos的木桩,使得跳跃次数最少。我们使用一个变量min_jumps来记录最小的跳跃次数,然后遍历curr_pos到next_pos之间的木桩,更新min_jumps。最后,curr_jumps加上min_jumps,更新max_jumps和curr_pos。

最后输出max_jumps即可。

9、翻卡片

题目描述:

小蓝在玩翻卡片游戏,每张卡片一面写着大写字母“A”,另一面写着大写字母“B”。首先将卡片排成一个N*N的矩阵。有的卡片是A面朝上,有的卡片是B面朝上。

现给定N的值,及N*N矩阵中每张卡片的状态,请你帮助小蓝挑选一张B面的卡,翻转成A面,使得翻转后的上、下、左、右四个方向相连的A面卡片最多,并将相连最多的卡片数量输出。

例如:N=3,3*3的矩阵中的卡片状态如下:

选择红框内那张B面卡片,翻转为A面,可以使翻转后四个方向相连的A面卡片最多,为5张。

输入描述

第一行输入一个正整数N(2≤N≤50),表示矩阵的行数和列数

第二行开始输入N行,每行输入N个字符(‘A’或者‘B’),表示矩阵中卡片状态,字符之间以一个空格隔开 

输出描述

输出一个整数,表示翻转后矩阵中上、下、左、右四个方向相连的最多A面卡片张数


样例输入

3
A B B
A B A
B A B

样例输出

5

参考答案:```#include #include using namespace std;int count(vector>& matrix, int i, int j) int count = 0;if (i > 0 && matrix[i - 1][j] == 'A') count++;if (i < matrix.size() - 1 && matrix[i + 1][j] == 'A') count++;if (j > 0 && matrix[i][j - 1] == 'A') count++;if (j < matrix[0].size() - 1 && matrix[i][j + 1] == 'A') count++;return count;int main() int N;cin >> N;vector> matrix(N, vector(N));for (int i = 0; i < N; i++) {for (int j = 0; j < N; j++) {cin >> matrix[i][j];}}int maxCount = 0;for (int i = 0; i < N; i++) {for (int j = 0; j < N; j++) {if (matrix[i][j] == 'B') {int count = count(matrix, i, j) + 1;maxCount = max(maxCount, count);}}}cout << maxCount << endl;return 0;```

解析:【喵呜刷题小喵解析】:
本题可以通过模拟的方式来解决。首先,我们需要读入矩阵的大小N和矩阵中的每个元素。然后,我们遍历矩阵中的每个元素,当遇到B面的卡片时,计算翻转该卡片后能够连接的A面卡片的最大数量,并更新最大数量。具体计算的方式是通过判断该卡片上、下、左、右四个方向的卡片是否为A面,如果是,则数量加一。最后,输出最大数量即可。

在代码实现中,我们使用一个二维数组来表示矩阵,使用一个函数来计算某个卡片翻转后能够连接的A面卡片的数量。在主函数中,我们先读入矩阵的大小和元素,然后遍历矩阵中的每个元素,当遇到B面的卡片时,调用函数计算数量,并更新最大数量。最后,输出最大数量即可。

10、金箍棒

题目描述:

淘气的悟空变出了N根高度各不相同的金箍棒(1≤高度≤1000),并排列成一排。悟空可以对每根金箍棒施法,让金箍棒高度变短或者变长,但每一次施法只能使一根金箍棒变短1个高度或者变长1个高度。

现在悟空想通过施法将K(K≤N)根相邻的金箍棒高度变为相同,且要求施法的次数最少,请你帮助悟空计算出最少需要施法几次可以使K根相邻的金箍棒高度变为相同。

例如:N=3,K=2,3根金箍棒初始高度分别为:3,6,1。

第一次对高度为3金箍棒施法变长1个高度,变为4;

第二次对高度为6金箍棒施法变短1个高度,变为5;

第三次对高度为4金箍棒施法变长1个高度,变为5;

2根相邻的金箍棒高度变为相同,最少施法3次。

输入描述

第一行输入两个正整数N,K (1≤K≤N≤10000),N表示金箍棒的根数,K表示需要将K根相邻的金箍棒高度变为相同,两个整数之间以一个空格隔开

第二行输入N个各不相同的正整数 (1≤正整数≤1000),表示N根金箍棒的初始高度,N个整数之间以一个空格隔开

输出描述

输出一个整数,表示悟空最少需要施法几次可以使K根相邻的金箍棒高度变为相同

样例输入

3 2
3 6 1

样例输出

3

参考答案:为了使K根相邻的金箍棒高度变为相同,我们需要对金箍棒进行高度调整。由于每次只能使一根金箍棒变短或变长1个高度,我们需要考虑如何以最少的次数调整金箍棒的高度。首先,我们需要找到高度差最大的两根金箍棒。假设这两根金箍棒的高度分别为h1和h2,且h1 < h2。我们可以从高度h1开始,通过连续变长的方式将高度调整到h2,或者从高度h2开始,通过连续变短的方式将高度调整到h1。这两种方式中,选择次数较少的那一种即可。具体步骤如下:1. 找到高度差最大的两根金箍棒,假设它们的高度分别为h1和h2,且h1 < h2。2. 计算高度差diff = h2 - h1。3. 如果diff是偶数,那么从h1开始,每次变长1个高度,需要diff/2次;从h2开始,每次变短1个高度,也需要diff/2次。取两者中较小的次数作为调整次数。4. 如果diff是奇数,那么从h1开始,每次变长1个高度,需要(diff+1)/2次;从h2开始,每次变短1个高度,需要diff/2次。取两者中较小的次数作为调整次数,并加1。根据上述思路,我们可以编写算法来解决这个问题。具体算法如下:1. 遍历金箍棒数组,找到高度差最大的两根金箍棒,假设它们的高度分别为h1和h2,且h1 < h2。2. 计算高度差diff = h2 - h1。3. 根据diff是偶数还是奇数,选择合适的调整方式,并计算调整次数。4. 返回调整次数。

解析:【喵呜刷题小喵解析】:
对于这个问题,我们首先需要明确目标:使K根相邻的金箍棒高度变为相同,并且要求施法的次数最少。

观察题目中的例子,我们可以发现,为了使两根相邻的金箍棒高度相同,我们需要对它们进行高度调整。具体地,我们可以选择让其中一根金箍棒变长,让另一根金箍棒变短,或者对两根金箍棒都进行相同次数的变长或变短操作。

考虑到每次只能使一根金箍棒变短或变长1个高度,我们需要选择最少次数的操作来达到目标。为了实现这一点,我们可以按照以下步骤进行:

1. 首先,找到高度差最大的两根金箍棒,假设它们的高度分别为h1和h2,且h1 < h2。
2. 计算高度差diff = h2 - h1。
3. 如果diff是偶数,那么从h1开始,每次变长1个高度,需要diff/2次;从h2开始,每次变短1个高度,也需要diff/2次。取两者中较小的次数作为调整次数。
4. 如果diff是奇数,那么从h1开始,每次变长1个高度,需要(diff+1)/2次;从h2开始,每次变短1个高度,需要diff/2次。取两者中较小的次数作为调整次数,并加1。

这样,我们就可以通过最少次数的操作使两根相邻的金箍棒高度相同。对于K根相邻的金箍棒,我们可以按照类似的方式进行操作,只不过需要找到高度差最大的K根金箍棒,并分别计算它们之间的高度差,然后取其中的最小值作为最少需要施法的次数。

根据以上分析,我们可以编写算法来解决这个问题。算法的基本思路是:首先找到高度差最大的K根金箍棒,然后计算它们之间的高度差,并取其中的最小值作为最少需要施法的次数。最后,返回这个次数作为结果。

11、路线

题目描述:

小蓝将多盆鲜花摆成一个M*N的矩阵,小蓝每天都会从左上角位置的花盆出发,给每一个花盆中的鲜花浇水。

已知:

1)每两个相邻的花盆之间的距离都相等;

2)每次小蓝浇水的路线都是走直线,不能走斜线;

3)除左上角花盆以外,其他花盆只能经过一次;

4)每盆花都浇过之后返回左上角位置。

当给出M和N的值,请你帮助小蓝找出一共有多少条路线可以满足以上条件,如果没有满足条件的路线输出0。

例如:M=3,N=4,一共有4条路线满足以上条件。

时间限制: 1000MS

内存限制: 65536KB

输入描述

输入两个正整数M,N(2≤M≤10,2≤N≤10),M表示矩阵的行数,N表示矩阵的列数,两个正整数之间以一个空格隔开

输出描述

输出一个整数,表示一共有多少条路线可以满足以上条件,如果没有满足条件的路线输出0


样例输入

3 4

样例输出

4

参考答案:```pythondef count_paths(m, n):dp = [[0] * (n + 1) for _ in range(m + 1)]for i in range(m + 1):for j in range(n + 1):if i == 1 and j == 1:dp[i][j] = 1elif i == 1:dp[i][j] = dp[i][j - 1]elif j == 1:dp[i][j] = dp[i - 1][j]else:dp[i][j] = dp[i - 1][j] + dp[i][j - 1]return dp[m][n] if dp[m][n] != 0 else 0m, n = map(int, input().split())print(count_paths(m, n))```

解析:【喵呜刷题小喵解析】:
本题要求找出所有满足条件的浇水路线数量,即小蓝在给鲜花浇水的过程中,只能沿着矩阵的行和列方向走,不能斜着走,并且每个花盆只能被浇一次水。

我们可以使用动态规划来解决这个问题。首先,我们定义一个二维数组dp,其中dp[i][j]表示从左上角走到第i行第j列的花盆的路线数量。

根据题目要求,我们可以得到以下状态转移方程:

1. 当i=1且j=1时,dp[i][j] = 1,因为只有一条路线,即直接走到当前位置。
2. 当i=1时,dp[i][j] = dp[i][j-1],表示从上一列的花盆走过来。
3. 当j=1时,dp[i][j] = dp[i-1][j],表示从上一行的花盆走过来。
4. 否则,dp[i][j] = dp[i-1][j] + dp[i][j-1],表示从上一行的花盆走过来或者从上一列的花盆走过来。

最后,返回dp[m][n]即可得到结果。

需要注意的是,当m或n为1时,矩阵只有一个花盆,此时没有满足条件的路线,直接返回0。

喵呜刷题:让学习像火箭一样快速,快来微信扫码,体验免费刷题服务,开启你的学习加速器!

创作类型:
原创

本文链接:第13届蓝桥杯C++青少组_国赛_中/高级组_2022年5月29日真题答案及解析

版权声明:本站点所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明文章出处。
分享文章
share