image

编辑人: 舍溪插画

calendar2025-07-27

message8

visits240

第12届蓝桥杯C++青少组中/高级组国赛2021年5月真题答案及解析

一、单选题

1、在C++中当一个函数没有返回值时,函数的类型应定义为(  )。

A int

B 任意类型

C 空

D void

解析:【喵呜刷题小喵解析】在C++中,如果一个函数没有返回值,那么它的类型应该定义为`void`。这是因为`void`关键字在C++中用于表示没有返回值的函数。所以,选项D是正确答案。其他选项如`int`、`任意类型`和`空`都是不正确的。

2、设两个bool类型的变量x和y,以下哪个选项可以使表达式“x&&y”为真(  )。

A x和y都为真

B x和y其中一个为真

C  x和y都为假

D x和y其中一个为假

解析:【喵呜刷题小喵解析】在C++或Java等编程语言中,逻辑与操作符"&&"要求两个操作数都为真时,整个表达式才为真。如果x和y中有一个为假,那么表达式"x&&y"就会为假。因此,要使"x&&y"为真,x和y都必须为真。所以,正确答案是A选项,即x和y都为真。

3、已知“int a[10]={1,2,3,4,5,6,7,8,9,10};   int *p=&a[3],b;   b=p[5];”,则b的结果为 (   ) 。

A 5

B 6

C 9

D 10

解析:【喵呜刷题小喵解析】首先,我们分析给定的代码段:


```c
int a[10] = {1,2,3,4,5,6,7,8,9,10};
int *p = &a[3], b;
b = p[5];
```
1. `int a[10] = {1,2,3,4,5,6,7,8,9,10};` 这行代码定义了一个包含10个整数的数组`a`,并初始化了它的前10个元素。
2. `int *p = &a[3];` 这行代码定义了一个指向整数的指针`p`,并将其初始化为指向数组`a`的第四个元素(索引为3的元素)的地址。
3. `b = p[5];` 这行代码将指针`p`所指向的数组元素的偏移5个位置的值赋给变量`b`。

因为`p`指向`a`数组的第四个元素(即索引为3的元素),所以`p[5]`实际上是`a[3+5]`,即`a[8]`。

因此,`b`的值就是`a[8]`,即9。

所以,正确答案是C,即9。

4、下列关于数组维数的描述中,错误的是(  )。

A 定义数组时必须将每维的大小都明确指出

B 二维数组是指该数组的维数为2

C 数组的维数可以使用常量表达式

D 数组元素个数等于该数组的各维大小的乘积

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

A选项描述的是定义数组时必须将每维的大小都明确指出,这是正确的,因为数组的定义需要明确其各维的大小。

B选项描述的是二维数组是指该数组的维数为2,这是错误的。二维数组指的是数组有两个下标,而维数描述的是数组的维度,与下标的数量不一定相等。例如,三维数组也可以有两个下标。

C选项描述的是数组的维数可以使用常量表达式,这是正确的,数组的维数可以用常量表达式来表示。

D选项描述的是数组元素个数等于该数组的各维大小的乘积,这也是正确的,数组的元素个数确实是其各维大小的乘积。

因此,错误的是B选项。

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

A 若要实现一个接口为普通类则必须实现接口的所有抽象方法

B 接口之间不能有继承关系

C 接口与抽象类是相同的概念

D 一个类只能实现一个接口

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

A选项描述正确,接口是一种定义方法特征的引用类型,它不能包含实例字段,只能包含抽象方法。如果一个类要实现一个接口,那么它必须实现接口中定义的所有抽象方法。

B选项描述错误,接口之间可以有继承关系,一个接口可以继承一个或多个其他接口,这样,子类接口就可以从父接口那里继承方法。

C选项描述错误,接口和抽象类并不是相同的概念。接口是一种引用类型,只能包含抽象方法,不能包含实例字段。抽象类可以包含实例字段和抽象方法,也可以包含非抽象方法。

D选项描述错误,一个类可以实现多个接口,通过实现多个接口,类可以具有多种功能。在Java中,一个类可以实现多个接口,只需要使用“implements”关键字列出所有接口即可。

二、实操题

6、加密

题目描述:

给定一个只含英文字母(英文字母含大小写字母)的字符串作为原始密码,按照规则将其加密,并输出加密后的密码。

加密规则:原始密码每一位上的字母,使用其在字母表中其后的第三个字母替代原来的字母。

如:原始密码为abC,a的字母表中其后三个字母为d,b后三个字母为e,C后三个字母为F,故加密后的密码为deF。

注:

1.当原始密码当前位的字母为小写,加密后的密码为字母表中其后的第三个小写字母;

当原始密码当前位的字母为大写,加密后的密码为字母表中其后的第三个大写字母;

2.原始密码中的英文字母不能为x(X),y(Y),z(Z)。

输入描述:

输入N个英文字母(包含大小写字母,但不包含大小写的‘x’,‘y’,‘z’,2<N<101)作为原始密码

输出描述:

按照加密规则输出一个字符串,作为加密后的密码


样例输入:

abC

样例输出:

deF

参考答案:根据题目描述,加密规则是将原始密码每一位上的字母,使用其在字母表中其后的第三个字母替代原来的字母。对于小写字母,加密后的密码为字母表中其后的第三个小写字母;对于大写字母,加密后的密码为字母表中其后的第三个大写字母。同时,原始密码中的英文字母不能为x(X),y(Y),z(Z)。因此,对于样例输入"abC",a的字母表中其后三个字母为d,b后三个字母为e,C后三个字母为F,故加密后的密码为deF。

解析:【喵呜刷题小喵解析】:
本题主要考察的是字符串处理和加密规则的理解。根据题目描述,我们需要将输入的原始密码每一位上的字母,使用其在字母表中其后的第三个字母替代原来的字母。

首先,我们需要遍历输入的原始密码,对于每一位字母,判断其是否为小写字母或大写字母,然后分别找到其在字母表中其后的第三个字母。

具体实现时,我们可以使用ASCII码表来辅助判断字母的大小写,并找到其后三个字母的ASCII码。由于ASCII码表中,字母是连续排列的,因此可以通过加减运算来找到其后三个字母的ASCII码。

最后,将加密后的密码输出即可。

需要注意的是,题目中特别指出原始密码中的英文字母不能为x(X),y(Y),z(Z),因此在实现时需要特别处理这些情况。如果不满足这个条件,可以输出错误信息或者按照题目要求进行处理。

7、分解质因数

提示信息:

质数:是一个大于1的自然数,且除了1和它本身外,不能被其他自然数整除的数。最小的质数是2,1不是质数。

合数:一个正整数,如果除1和它本身以外,还能被其他正整数整除,叫合数。如6是合数,除了1和6以外,还能被2和3整除。 

分解质因数:每个合数都可以写成几个质数相乘的形式,其中每个质数都是这个合数的因数,把一个合数用质因数相乘的形式表示出来,叫做分解质因数(分解质因数只针对合数)。如合数12=2×2×3 。

分解质因数的方法是先用这个合数的最小质因数去除这个合数,结果若是一个质数就不再除下去;若是一个合数就继续按原来的方法从最小质因数除起,直至最后除得的结果是一个质数 。

例如:

合数18分解质因数,首先用最小质因数2去除,除后结果为合数9,继续用最小质因数3去除,除后结果为质数3,就不再除下去。所以18的质因数为2、3、3,故质因数的个数为3;

题目描述:

给定一个合数N,将N分解质因数后,输出其质因数个数。

输入描述:

输入一个合数N         

输出描述:

将N分解质因数后,输出质因数个数


样例输入:

18

样例输出:

3

参考答案:给定一个合数N,将N分解质因数后,输出其质因数个数。

解析:【喵呜刷题小喵解析】:
首先,我们需要理解题目中的“分解质因数”的概念。质因数是指一个合数可以分解为若干个质数的乘积,这些质数就是该合数的质因数。例如,合数12可以分解为2×2×3,其中2和3就是12的质因数。

为了得到质因数的个数,我们需要将给定的合数进行质因数分解,并统计质因数的个数。具体步骤如下:

1. 首先,找到合数的最小质因数。
2. 使用这个最小质因数去除合数,得到一个新的数。
3. 如果新的数是质数,那么质因数分解结束,统计质因数的个数并返回。
4. 如果新的数不是质数,那么继续找到这个数的最小质因数,重复步骤2和3,直到得到质数为止。

对于题目中的样例输入18,我们可以按照上述步骤进行质因数分解:

1. 18的最小质因数是2,用2去除18得到9。
2. 9的最小质因数是3,用3去除9得到3。

因此,18的质因数有2、3、3,质因数的个数为3。

8、开关/门

编程实现:

推理

某校有N间教室,且每间教室有2扇门,一共有2 ×N 扇门,每扇门都有编号,分别从1到 2×N 。

开始时,所有门为关闭状态。现在按照以下规则对门进行处理:

第一次,将所有门打开。

第二次,将所有编号为2的倍数的门作相反的处理(原来是打开的就关闭,原来是关闭的就打开)。

第三次,将所有编号为3的倍数的门作相反的处理(原来是打开的就关闭,原来是关闭的就打开)。

……

第N次,将所有编号为N的倍数的门作相反的处理(原来是打开的就关闭,原来是关闭的就打开)。

问第N次处理后,有多少扇门为打开状态?

【输入格式】

输入一个正整数 N (2 ≤ N ≤100) ,代表有 N间教室。

【输出格式】

按照规则对门进行 N次处理之后,计算有多少扇门为打开状态并输出。


样例输入

2

样例输出

2

【样例解释】

N=2 ,每间教室有 2扇门,一共有 4扇门,门编号分别为 1 , 2 , 3 , 4 。

初始状态:四扇门都为关闭状态。

第一次,将四扇门全部打开。

第二次,将编号为 2 的倍数的门作相反的处理,即将 2 号门和 4 号门关闭。

经过两次处理之后,共有 2 扇门为打开状态。

参考答案:根据题目描述,我们可以使用数学公式和编程来实现对门开关状态的计算。具体来说,我们可以按照以下步骤进行:1. 初始化一个长度为2N的数组,表示2N扇门的开关状态,初始值都为0(表示关闭状态)。2. 从1到N遍历每个数i,对于每个数i,将数组中下标为i的倍数的元素取反(0变为1,1变为0)。3. 统计数组中值为1的个数,即为打开状态的门的数量。

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

这个问题可以通过数学和编程来解决。首先,我们注意到每次操作都是对特定编号的门进行开关状态的取反,这意味着我们可以使用数组来模拟这个过程。

在初始状态下,所有的门都是关闭的,所以我们可以使用一个长度为2N的数组来表示门的开关状态,其中0表示关闭,1表示打开。

然后,我们按照题目的规则进行操作。从1到N遍历每个数i,对于每个数i,我们将数组中下标为i的倍数的元素取反。这是因为根据题目的规则,我们需要将编号为i的倍数的门进行开关状态的取反。

最后,我们统计数组中值为1的个数,即为打开状态的门的数量。

这个问题的关键在于理解题目中的规则,并使用数组来模拟这个过程。通过编程实现,我们可以很容易地解决这个问题。

9、最大值

题目描述:

某校庆祝元旦需要采购一些瓜子在联欢会上食用,学校给了固定资金n元让小蓝去超市采购瓜子,且要求采购最多的瓜子。到了超市发现有m种瓜子,且都是成袋售卖。小蓝这下为难了,不知道如何才能用固定资金采购最多的瓜子。

在给出每种瓜子每袋的价格、每袋的重量,请你帮助小蓝计算下用n元最多能采购多少瓜子。

例如:

给定的资金n为80元,瓜子种类m为2种:

第一种瓜子每袋18元,每袋10千克;

第二种瓜子每袋30元,每袋20千克;

用80元资金最多可以买50千克瓜子(买2袋第二种,1袋第一种的,总重量50千克,使用资金78元)。

输入描述:

第一行输入两个正整数n(1 ≤n ≤1000)和m(1 ≤m ≤ 30),用一个空格隔开,n代表买瓜子的资金,m代表超市瓜子种类数

接下来输入m行,每行输入两个正整数p(1 < p < 101)和k(1 < k < 101)且用一个空格隔开,p代表每袋瓜子的价格,k代表每袋瓜子的重量

输出描述:

输出一个正整数,代表n元钱最多能采购到的瓜子重量(千克)


样例输入:

80 2
18 10
30 20

样例输出:

50

参考答案:对于这个问题,我们可以使用贪心算法来解决。首先,我们按照瓜子的价格与重量的比值(即单位重量的价格)进行排序,比值越小的越优先购买。然后,我们按照顺序使用资金购买瓜子,直到资金用完或者无法再购买为止。最后,我们返回购买到的瓜子的总重量。

解析:【喵呜刷题小喵解析】:
这个问题是一个典型的贪心算法问题。贪心算法是一种在每一步选择中都采取当前情况下最好或者最优(即最有利)的选择,从而希望导致结果是全局最好或者最优的算法。

在这个问题中,我们首先需要确定购买瓜子的顺序。根据题目要求,我们需要使用固定资金n元购买最多的瓜子,所以我们需要尽可能地购买单位重量价格更低的瓜子。因此,我们可以按照瓜子的价格与重量的比值进行排序,比值越小的越优先购买。

具体算法步骤如下:

1. 首先,输入资金n和瓜子种类数m,以及每种瓜子的价格和重量。
2. 计算每种瓜子的单位重量的价格,即价格除以重量,并按照从小到大的顺序进行排序。
3. 初始化购买的瓜子的总重量为0。
4. 遍历排序后的瓜子列表,对于每种瓜子,如果当前资金足够购买一袋,则购买一袋,并将当前资金减去该袋瓜子的价格,同时将购买的瓜子的总重量加上该袋瓜子的重量。
5. 如果遍历完所有瓜子后,资金还有剩余,则无法再购买更多的瓜子,直接返回购买的瓜子的总重量。
6. 如果遍历完所有瓜子后,资金刚好用完,则返回购买的瓜子的总重量。

这样,我们就可以使用贪心算法来解决这个问题,从而得到用n元最多能采购到的瓜子重量。

10、投球游戏

题目描述:

有一个投球游戏,玩法是将球投到N个篮筐里。具体玩法如下:

投篮顺序必须同时符合以下三个规则:

例如给出的3个篮筐距离和顺序为130 200 55。

规则一:

 第一次投篮可以投任意一个篮筐;

规则二:

从第二次投篮开始,每一次投篮只能投顺序在上一次篮筐的后面的篮筐;

如果第一次投的200篮筐,那么接下来就不能投130的篮筐,可以投55的篮筐。

规则三:

从第二次投篮开始,每一次投篮只能投比上一次投篮距离更近的篮筐。

如果第一次投的130的篮筐,那么接下来不能投200的篮筐,只能投55的篮筐。

现给出N的数值,和N个篮筐的距离及顺序,假定每次投篮都能投进,请你编写程序计算按照投球规则最多能投进几个球。

如:N=3,3个篮筐的距离及顺序为:130 200 55  

按照三条规则,一共有以下三种投球方案:

1)如果第一次投130,那么投130,55,最多可以投进2球;

2)如果第一次投200,那么投200,55,最多可以投进2球;

3)如果第一次投55,那么投55,最多可以投进1球。

则按照规则最多可投进2球。

输入描述:

第一行输入一个正整数N(2<N<20)表示篮筐的个数

第二行分别输入N个正整数(10<正整数<1000)并以一个空格隔开,分别表示篮筐距离和N个篮筐顺序,每个篮筐的距离都不相同

输出描述:

输出一个整数,表示最多能投进球的个数


样例输入:

3
130 200 55

样例输出:

2

参考答案:2

解析:【喵呜刷题小喵解析】:
根据题目描述,我们需要按照三个规则来确定最多能投进球的个数。

规则一:第一次投篮可以投任意一个篮筐。
规则二:从第二次投篮开始,每一次投篮只能投顺序在上一次篮筐的后面的篮筐。
规则三:从第二次投篮开始,每一次投篮只能投比上一次投篮距离更近的篮筐。

根据这三个规则,我们可以得出以下结论:

1. 第一次投篮可以选择任意一个篮筐,假设选择了第一个篮筐,那么最多能投进的球数为该篮筐及之后的最近距离的篮筐,即两个。
2. 第一次投篮可以选择任意一个篮筐,假设选择了第二个篮筐,那么最多能投进的球数为该篮筐及之后的最近距离的篮筐,即两个。
3. 第一次投篮可以选择任意一个篮筐,假设选择了第三个篮筐,那么最多能投进的球数只有该篮筐一个。

因此,我们需要比较这三种情况,找出能投进最多的球数。根据题目中给出的篮筐距离和顺序,第一次投篮选择第一个篮筐或第二个篮筐都能投进两个球,选择第三个篮筐只能投进一个球。因此,按照规则最多能投进的球数为2。

因此,输出的结果应该是2。

11、采摘园

题目描述:

有一个矩形的采摘园,采摘园里有N排M列果树,其中有梨树和苹果树,一天小青要去采摘园采摘果子,到了采摘园,看到提示牌写的:

1.只可以采摘苹果,梨树暂不能采摘(未成熟);

2.采摘的起点是从采摘园中指定的某一颗苹果树;

3.从起点开始可以向上、向下、向左、向右移动(只能在采摘园中移动),且只能在苹果树下移动,不能越过梨树。

编写一个程序,计算小青从起点出发最多可到达多少棵苹果下采摘(包括起点苹果树)。

例如:矩形的采摘园种有3排4列的果树,用数字“1”表示苹果树,用数字“2”表示梨树,用数字“6”表示起点(起点也是苹果树),故从起点出发最多可到达7棵苹果下采摘(包含起点苹果树)。

如图所示:

输入描述:

第一行输入两个以一个空格隔开的正整数 N(2<N<51),M(2<M<51),分别表示N排M列的果树;

接下来的N行每行输入M个数字并以一个空格隔开,数字为“1”、“2”、“6”,分别表示苹果树,梨树及起点(起点也是苹果树)

输出描述:

输出一个整数,表示小青在N*M的采摘园中从起点出发最多可到达几棵苹果下采摘(包含起点苹果树)


样例输入:

3 4
2 1 2 1
1 6 1 2
1 1 1 2

样例输出:

7

参考答案:根据题目描述,我们需要编写一个程序来计算小青从起点出发最多可到达多少棵苹果下采摘(包括起点苹果树)。首先,我们需要读取输入,包括采摘园的尺寸(N和M)以及每个位置上的果树类型(1表示苹果树,2表示梨树,6表示起点)。然后,我们可以使用深度优先搜索(DFS)算法来遍历采摘园,从起点开始,向上、向下、向左、向右移动,并计算到达的苹果树数量。具体实现时,我们可以使用一个二维数组来表示采摘园,使用一个变量来记录当前位置,使用一个变量来记录到达的苹果树数量,以及一个栈来保存需要回溯的位置。具体算法如下:1. 初始化变量,包括采摘园的尺寸、果树类型数组、当前位置、到达的苹果树数量以及栈。2. 遍历果树类型数组,找到起点位置。3. 从起点位置开始,使用DFS算法遍历采摘园,向上、向下、向左、向右移动,并计算到达的苹果树数量。4. 如果当前位置是苹果树,则将到达的苹果树数量加1。5. 如果当前位置不是梨树,则继续遍历相邻位置。6. 如果当前位置是梨树,则回溯到上一个位置。7. 如果栈为空,则结束遍历,输出到达的苹果树数量。

解析:【喵呜刷题小喵解析】:
本题是一道典型的深度优先搜索问题,可以使用DFS算法来解决。在DFS算法中,我们需要使用一个栈来保存需要回溯的位置,以及使用一个变量来记录到达的苹果树数量。在遍历采摘园时,我们需要判断当前位置是否是苹果树,如果是苹果树,则将到达的苹果树数量加1。如果当前位置不是梨树,则继续遍历相邻位置。如果当前位置是梨树,则回溯到上一个位置。最终,当栈为空时,输出到达的苹果树数量即可。

需要注意的是,在遍历采摘园时,我们需要保证只能向上、向下、向左、向右移动,且只能在苹果树下移动,不能越过梨树。因此,在遍历相邻位置时,我们需要判断当前位置是否是梨树,如果是梨树,则不能进行下一步遍历。同时,我们需要使用一个二维数组来表示采摘园,以便在遍历过程中判断当前位置是否是苹果树或梨树。

另外,本题还需要注意输入和输出的格式,包括输入采摘园的尺寸和果树类型数组,输出到达的苹果树数量。在编写程序时,我们需要按照题目要求读取输入,并输出正确的结果。

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

创作类型:
原创

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

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