image

编辑人: 独留清风醉

calendar2025-06-15

message6

visits1158

第14届蓝桥杯C++青少组中/高级组选拔赛(STEMA)2022年11月27日真题答案及解析

一、单选题

1、执行 cout << 5 / 3; 语句后,输出的结果是(   )。

A 0

B 1

C 2

D 3

解析:【喵呜刷题小喵解析】在C++中,5/3会进行整数除法,结果为1。因此,执行cout << 5 / 3;语句后,输出的结果是1。

2、执行以下代码,输出的结果是(   )。

char a[6] = {'a', 'b', 'c', 'd'};

cout << sizeof(a);

A 4

B 6

C 8

D 12

解析:【喵呜刷题小喵解析】:在C++中,`sizeof`运算符返回的是变量类型在内存中所占用的字节数。对于字符数组`char a[6]`,它包含了6个字符,但由于每个字符在内存中占用1个字节,所以整个数组占用的字节数是6。因此,`sizeof(a)`返回的是6,而不是字符的数量。所以,正确答案是B。

3、关于C++中的一维数组,以下描述正确的是(   )。

A 数组中的元素类型可以不相同

B 数组在内存中有一段连续的单元

C 数组中的最后一个元素的下标(索引)为 -1

D 静态数组中的元素的个数可以大于数组初始时设定的长度

解析:【喵呜刷题小喵解析】:在C++中,一维数组是一组相同类型的元素的集合,所以选项A“数组中的元素类型可以不相同”是错误的。数组在内存中占有一段连续的存储单元,所以选项B“数组在内存中有一段连续的单元”是正确的。在C++中,数组的索引是从0开始的,所以选项C“数组中的最后一个元素的下标(索引)为 -1”是错误的。静态数组在初始时设定的长度是固定的,所以选项D“静态数组中的元素的个数可以大于数组初始时设定的长度”也是错误的。因此,正确答案是B。

4、以下关于 while 和 do...while 循环语句描述不正确的是(  )。

A do...while 的循环条件可以是 1

B while 的循环体可以是复合语句

C do...while 的循环体至少执行一次

D 执行 do...while 语句,首先判断循环条件,当满足循环条件,开始执行循环体中的语句

解析:【喵呜刷题小喵解析】:do...while 循环语句的执行流程是:首先执行循环体中的语句,然后判断循环条件,当满足循环条件时,再次执行循环体中的语句,如此循环。因此,选项D的描述是不正确的。而选项A、B、C都是正确的描述。其中,do...while 的循环体至少执行一次,所以选项C是正确的;while 和 do...while 的循环体都可以是复合语句,所以选项B是正确的;do...while 的循环条件可以是任何表达式,所以选项A也是正确的。

5、已知:int a, b = 5, *p = &a ,下列表达式哪一个可以将 b 赋值给 a ?(   )。

A *p = *&b;

B a = *p;

C a = &b;

D a = **p;

解析:【喵呜刷题小喵解析】:

首先,我们需要理解题目中的变量和指针。

变量a和b是整型变量,其中b已经被赋值为5。指针p指向变量a的地址。

接下来,我们分析每个选项:

A选项:*p = *&b;
这个表达式试图将b的值赋给a,但是使用了错误的指针操作。*p表示p指向的值,而&b表示b的地址,所以*&b是未定义的。

B选项:a = *p;
这个表达式将p指向的值(即a的值)赋给a,实际上并没有改变a的值。

C选项:a = &b;
这个表达式将b的地址赋给a,而不是b的值,所以不符合题目要求。

D选项:a = **p;
这个表达式试图解引用指针p两次,即**p,但是p指向的是a的地址,而不是一个指向指针的指针,所以**p是未定义的。

根据以上分析,只有B选项可以将b的值(即5)赋给a,但是实际上a的值并没有改变,因为a的值已经被初始化为未定义的值。

因此,虽然B选项在语法上是正确的,但是它并不能实现题目要求的功能。如果题目要求将b的值赋给a,那么应该使用a = b;这样的表达式。

所以,题目可能存在错误或者不完整,需要更多的上下文信息来确定正确答案。

二、实操题

6、切割蛋糕

【题目描述】

有一块矩形蛋糕,小明从蛋糕的正上方横向和纵向各切 N 刀(1 < N < 100),每刀互不重合。计算出蛋糕被切割成了几块。

例如:N = 2,蛋糕被切割成 9 块。

【输入格式】

输入一个正整数 N(1 < N < 100),表示蛋糕被横向和纵向各切割的刀数。

【输出格式】

输出一个整数,表示蛋糕最后被切割成了几块。

【输入样例1】

2

【输出样例1】

9

参考答案:对于蛋糕切割问题,可以使用组合数学中的组合公式C(n+m, n)来计算。其中n为横向切割的刀数,m为纵向切割的刀数。对于输入样例1,N=2,即横向和纵向各切割2刀。因此,蛋糕被切割成了C(2+2, 2)=6块。但需要注意的是,这6块中,有6个角上的小块是重复计算的。因此,实际切割成的块数为6+1=7块。然而,题目描述中明确指出蛋糕被切割成了9块,这说明题目描述可能存在错误或者使用了不同的切割方式。如果按照题目描述,蛋糕被切割成了9块,那么输出样例1应该是9,而不是7。

解析:【喵呜刷题小喵解析】:
本题目是一道组合数学题目,可以通过组合公式C(n+m, n)来计算蛋糕被切割成的块数。但是题目描述可能存在错误或者使用了不同的切割方式,导致计算结果与题目描述不符。因此,在编写代码时,需要根据题目描述来确定正确的切割方式,并输出正确的结果。如果题目描述存在错误,需要向出题人反馈问题。

7、拼写单词

【题目描述】

四种水果的英文单词,分别为 Apple、Banana、Orange、Pear。老师通过提示每个单词的首字母,让同学将对应的单词拼写下来。

请编写程序:

当输入的大写字母为 "A" 时,则输出 "Apple";

当输入的大写字母为 "B" 时,则输出 "Banana";

当输入的大写字母为 "O" 时,则输出 "Orange";

当输入的大写字母为 "P" 时,则输出 "Pear"。

【输入格式】

输入 A、B、O、P 中任意一个大写字母。

【输出格式】

输出一个字符串,表示大写字母对应的英文单词(单词首字母大写)。

【输入样例1】

A

【输出样例1】

Apple

参考答案:br />当输入的大写字母为 "A" 时,输出 "Apple";当输入的大写字母为 "B" 时,输出 "Banana";当输入的大写字母为 "O" 时,输出 "Orange";当输入的大写字母为 "P" 时,输出 "Pear"。

解析:【喵呜刷题小喵解析】
这个问题是一个简单的字符到单词的映射问题,要求根据输入的大写字母输出对应的水果英文单词。题目中明确给出了输入和输出格式,只需要按照题目要求编写程序即可。在编写程序时,可以使用条件语句(如if-else语句)来判断输入的大写字母,并输出对应的单词。本题没有需要深入探讨的知识点,主要是考察基本的编程逻辑和字符处理。

8、业务办理时间

【题目描述】

某服务大厅同时开放3个窗口为客户办理业务,窗口编号分别为1、2、3。

现有N(2≤N≤50)位客户需要办理业务,客户编号为1~N,作为办理业务的先后顺序。

起初三个窗口为空闲状态,空闲的窗口会按照客户编号顺序呼叫下一位客户。如果多个窗口同时为空闲状态,按照窗口编号顺序呼叫(1优先于2,2优先于3)。

现给出每位客户办理业务的时间(单位:分钟),请计算出N位客户全部办理完业务后,哪一个窗口合计办理业务的时间最短,并输出最短时间。

例如:N=7,7位客户编号分别为1、2、3、4、5、6、7,客户办理业务时间分别为3、5、2、4、7、1、6,(如下图):

初始客户编号为 1、2、3 的客户分别在 1、2、3 窗口同时办理业务;

窗口 3 用时 2 分钟办理完 3 号客户的业务,变为空闲状态,并按顺序呼叫 4 号客户,4 号客户用时 4 分钟。

窗口 1 用时 3 分钟办理完 1 号客户的业务,变为空闲状态,并按顺序呼叫 5 号客户,5 号客户用时 7 分钟。

窗口 2 用时 5 分钟办理完 2 号客户的业务,变为空闲状态,并按顺序呼叫 6 号客户,6 号客户用时 1 分钟。

6 分钟后,窗口 2 和 3 同时变为空闲状态,按顺序窗口 2 呼叫 7 号客户,7 号客户用时 6分钟。

全部客户办理完业务后,三个窗口总用时分别为 10分钟、12分钟、6分钟,用时最短的是窗口 3,最短时间为 6 分钟。

【输入格式】

第一行输入一个正整数 N(2 ≤ N ≤ 50),表示办理业务的客户数。

第二行输入 N 个正整数(1 ≤ 正整数 ≤ 50),依次表示每位客户办理业务的时间,正整数之间以一个空格隔开。

【输出格式】

输出一个整数,表示客户全部办理完业务,用时最短的窗口所用时间。

【输入样例1】

7
3 5 2 4 7 1 6

【输出样例1】

6

参考答案:首先,我们需要读取输入,包括客户数量和每位客户办理业务的时间。然后,我们模拟窗口办理业务的过程,记录每个窗口的办理时间。最后,我们找出办理时间最短的窗口,并输出其时间。

解析:【喵呜刷题小喵解析】:
这个题目是一个模拟题,要求我们模拟窗口办理业务的过程,并找出办理时间最短的窗口。首先,我们需要读取输入,包括客户数量和每位客户办理业务的时间。然后,我们模拟窗口办理业务的过程,记录每个窗口的办理时间。具体来说,我们可以使用一个数组来记录每个窗口的办理时间,初始时所有窗口的办理时间都为0。然后,我们按照客户编号顺序依次处理每个客户,如果某个窗口空闲,就让这个窗口办理当前客户的业务,并更新这个窗口的办理时间。最后,我们找出办理时间最短的窗口,并输出其时间。

需要注意的是,如果多个窗口同时为空闲状态,我们需要按照窗口编号顺序呼叫客户。因此,在模拟窗口办理业务的过程中,我们需要维护一个空闲窗口的队列,按照窗口编号顺序入队和出队。

此外,由于客户数量和客户办理业务的时间都是已知的,我们可以直接计算出每个窗口的办理时间,而不需要模拟整个办理过程。具体来说,我们可以按照客户编号顺序依次累加每个客户的办理时间,得到每个窗口的办理时间。然后,我们找出办理时间最短的窗口,并输出其时间。这种方法的时间复杂度为O(N),比模拟窗口办理业务的过程要快很多。

9、找路线

【题目描述】

现有 22 名小朋友,依次编号 1 到 22,22 名小朋友分别按照下图的位置站好。

每名小朋友只能按照图中箭头指向的方向移动。给出两名小朋友的编号 N 和 M(1≤ N < M ≤ 22),请你找出从编号 N 到编号 M 共有多少条不同的路线。

例如:N = 3,M = 7,从编号 3 的位置到编号 7 的位置共有 5 条路线,分别为:(3->5->7),(3->5->6->7),(3->4->5->7),(3->4->5->6->7),(3->4>6->7)。

【输入格式】

输入两个正整数 N 和 M(1 ≤ N < M ≤ 22),分别表示两名小朋友的编号,之间以一个空格隔开。

【输出格式】

输出一个整数,表示从编号 N 到编号 M 共有多少条不同的路线。

【输入样例1】

3 7

【输出样例1】

5

参考答案:首先,根据题目描述,我们可以将问题转化为从编号N的位置到编号M的位置的路线问题。由于每名小朋友只能按照图中箭头指向的方向移动,我们可以将问题转化为从编号N的位置开始,沿着箭头方向,能够到达编号M的位置的路线数量。这个问题可以使用深度优先搜索(DFS)或广度优先搜索(BFS)来解决。这里我们采用DFS的方式来解决。我们可以定义一个数组`dp`,其中`dp[i]`表示从编号1到编号i的路线数量。然后,我们从编号N开始,沿着箭头方向,依次计算`dp[i]`,直到编号M。具体的算法如下:1. 初始化`dp`数组,将`dp[i]`初始化为0,其中`i`的范围是1到22。2. 从编号N开始,沿着箭头方向,依次计算`dp[i]`。对于每个`i`,我们可以遍历从`i-1`到`i-6`的所有位置,如果`i-1`到`i-6`之间的位置在箭头方向上可以到达`i`,则将`dp[i]`加上`dp[j]`,其中`j`的范围是`i-1`到`i-6`。3. 最终,`dp[M]`就是从编号N到编号M的路线数量。

解析:【喵呜刷题小喵解析】:
这个问题是一个典型的动态规划问题,可以使用动态规划来解决。由于每名小朋友只能按照图中箭头指向的方向移动,我们可以将问题转化为从编号N的位置开始,沿着箭头方向,能够到达编号M的位置的路线数量。

我们可以定义一个数组`dp`,其中`dp[i]`表示从编号1到编号i的路线数量。然后,我们从编号N开始,沿着箭头方向,依次计算`dp[i]`,直到编号M。

具体的算法如下:

1. 初始化`dp`数组,将`dp[i]`初始化为0,其中`i`的范围是1到22。这是因为从编号1到编号i的路线数量肯定是从编号1到编号i-1的路线数量加上从编号i-1到编号i的路线数量,而编号1到编号0的路线数量为0,所以`dp[i]`初始化为0。
2. 从编号N开始,沿着箭头方向,依次计算`dp[i]`。对于每个`i`,我们可以遍历从`i-1`到`i-6`的所有位置,如果`i-1`到`i-6`之间的位置在箭头方向上可以到达`i`,则将`dp[i]`加上`dp[j]`,其中`j`的范围是`i-1`到`i-6`。这是因为从编号j到编号i的路线数量就是从编号j到编号i-1的路线数量加上从编号i-1到编号i的路线数量,而编号i-1到编号i的路线数量就是从编号i-2到编号i-1的路线数量加上从编号i-3到编号i-2的路线数量,以此类推,直到编号i-6。
3. 最终,`dp[M]`就是从编号N到编号M的路线数量。

需要注意的是,由于每名小朋友只能按照图中箭头指向的方向移动,所以在计算`dp[i]`时,我们只需要考虑从`i-1`到`i-6`的位置。这是因为在箭头方向上,编号i只能由编号i-1到编号i-6的位置到达。

另外,由于题目中给出了输入样例和输出样例,我们可以使用这些样例来验证我们的算法是否正确。

10、最大乘积

【题目描述】

小明有N(4≤N≤60)个玻璃球,他想将N个玻璃球拆分成若干份(份数≥2,且每份中的数量互不相等),从而使拆分后的每份玻璃球数量的乘积最大。请你编写程序帮助小明计算出最大乘积是多少。

例如:N = 5,5个玻璃球有2种符合条件的拆分方法:(4,1)、(3,2);

其中,能得到最大乘积的拆分方法为(3,2),最大乘积为6(6=3*2)。

【输入格式】

输入一个正整数N(4≤N≤60),表示玻璃球的总数量

【输出格式】

输出一个整数,表示最大乘积

【输入样例1】

5

【输出样例1】

6

参考答案:为了找到拆分玻璃球的最大乘积,我们可以使用动态规划的方法。首先,我们可以定义一个数组dp,其中dp[i]表示将i个玻璃球拆分成若干份的最大乘积。我们可以从i=2开始,逐个计算dp[i]的值。对于每个i,我们可以遍历从2到i-1的所有数j,将i拆分成j和i-j两份。如果j和i-j的乘积大于dp[i],则更新dp[i]的值为j和i-j的乘积。最后,当i等于N时,dp[N]就是我们要找的最大乘积。

解析:【喵呜刷题小喵解析】:
这个题目要求找到拆分玻璃球的最大乘积,可以使用动态规划的方法来解决。动态规划是一种通过把原问题分解为相对简单的子问题的方式来求解复杂问题的方法。在这个问题中,我们可以使用dp数组来保存子问题的解,从而避免重复计算。

具体的算法如下:

1. 初始化dp数组,dp[i]表示将i个玻璃球拆分成若干份的最大乘积。
2. 从i=2开始,逐个计算dp[i]的值。
3. 对于每个i,我们可以遍历从2到i-1的所有数j,将i拆分成j和i-j两份。
4. 如果j和i-j的乘积大于dp[i],则更新dp[i]的值为j和i-j的乘积。
5. 最后,当i等于N时,dp[N]就是我们要找的最大乘积。

这个算法的时间复杂度是O(N^2),其中N是玻璃球的总数量。由于N的取值范围是4到60,所以这个算法可以在合理的时间内运行。

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

创作类型:
原创

本文链接:第14届蓝桥杯C++青少组中/高级组选拔赛(STEMA)2022年11月27日真题答案及解析

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