image

编辑人: 长安花落尽

calendar2025-06-01

message7

visits527

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

一、单选题

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

A 0

B 15

C 125

D 2

解析:【喵呜刷题小喵解析】根据C++语言的基本运算符优先级,乘法运算的优先级高于输出运算。所以,在执行cout<<5*3;语句时,先执行5*3的计算,得到结果15,然后将15输出到控制台。因此,输出的结果是15,选项B正确。

2、下列选项中,按照数据类型的字节长度从小到大排序正确的是(   )。

A char,long long,float

B char,float,long long

C long long,float,char

D float,long long,char

解析:【喵呜刷题小喵解析】在大多数现代计算机系统中,数据类型的字节长度如下:

1. char:通常是1个字节。
2. float:通常是4个字节。
3. long long:通常是8个字节。

按照从小到大的顺序,它们应该是:char,float,long long。因此,正确答案是B选项。请注意,这里提到的字节长度可能因具体的系统和编译器而异,但通常情况下是这样的。

3、下列表达式结果为true的是(   )。

A 'z' == 'Z'

B 'z' < 'Z'

C '9' > 'Z'

D 'c' +1> 'D'

解析:【喵呜刷题小喵解析】在ASCII编码中,'z'的编码值小于'Z'的编码值,所以'z' < 'Z'的表达式结果为true。而'z' == 'Z'的表达式结果为false,因为它们的ASCII编码值不相等。'9' > 'Z'的表达式结果为false,因为'9'的ASCII编码值小于'Z'的ASCII编码值。'c' + 1 > 'D'的表达式语法错误,因为字符不能直接进行加法运算。因此,只有选项B的表达式结果为true。

4、下列选项中,对二维数组a初始化不正确的是(   )。

A int a[2][3]={{1,2,3},{4,5,6}} ;

B int a[2][3]={{1,2},{3}} ;  

C int a[2][3]={1,2,3,4,5,6} ;

D int a[2][3]={{1,2},{3,4},{5,6}} ;

解析:【喵呜刷题小喵解析】:二维数组的初始化规则是:如果定义数组时指定了二维数组的行数和列数,则必须为数组中的每个元素指定一个值。在选项C中,int a[2][3]={1,2,3,4,5,6};这种初始化方式是不正确的,因为这里只有6个值,而二维数组a有2行3列,总共需要6个元素,但是6个值无法填充到二维数组中,因为二维数组的元素是按照行优先顺序进行填充的,所以这种初始化方式是不正确的。选项A、B和D都是正确的初始化方式,它们都能为二维数组a中的每个元素指定一个值。

5、定义int a[5], *p = a; 则对a数组元素的正确引用是(   )。

A *&a [5]

B a +2

C *(p+5)

D *(p+2)

解析:【喵呜刷题小喵解析】在C语言中,数组名其实就是指向数组第一个元素的指针,因此 `a` 本质上是一个指向 `int` 类型的指针,其值就是数组首元素的地址。而 `*p = a;` 这行代码表示 `p` 是一个指向 `int` 类型的指针,并且它的初始值就是数组 `a` 的首元素的地址,所以 `p` 和 `a` 指向的是同一个地址。因此,我们可以通过 `*(p+i)` 的方式访问数组的第 `i` 个元素,其中 `i` 是从0开始的索引。所以选项D `*(p+2)` 表示的是数组的第3个元素,这是正确的引用方式。选项A `*&a[5]` 是错误的,因为数组名是指向首元素的指针,所以 `a[5]` 是越界的。选项B `a+2` 也不是正确的引用方式,它表示的是数组第3个元素之后的地址,而不是第3个元素本身。选项C `*(p+5)` 表示的是数组的第6个元素,这是越界的。

二、实操题

6、求位数

题目描述:

给定一个正整数N(1<N<108),输出N为几位数。

输入描述:

输入一个正整数N(1<N<108

输出描述:

输出一个整数,表示N为几位数


样例输入:

15

样例输出:

2

参考答案:```输入的正整数N为n如果 n < 10,输出1如果 10 <= n < 100,输出2如果 100 <= n < 1000,输出3如果 1000 <= n < 10000,输出4如果 10000 <= n < 1000000,输出5如果 1000000 <= n < 10000000,输出6如果 n >= 10000000,输出7```

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

由于给定的N在1到10^8之间,所以N可以是1位数、2位数、3位数、4位数、5位数、6位数或7位数。我们可以通过判断N的范围来确定其位数。例如,如果N在10到99之间,那么N就是2位数。同理,如果N在1000到9999之间,那么N就是4位数。我们可以按照这种方式编写代码,通过判断N的范围来输出其位数。

7、字符反转

题目描述:

给定一个只包含大写字母“M”和“W”的字符串(字符串长度小于100),然后对字符串中位置为偶数的字符进行反转(M反转为W,W反转为M;字符串中左边第1个字符位置为1)。

例如:原字符串为“WMMW”,反转后为“WWMM”

输入描述:

输入一个只包含大写字符“M”和“W”的字符串(字符串长度小于100)

输出描述:

输出一个字符串,表示对原字符串中位置为偶数的字符反转后的字符串


样例输入:

WMMW

样例输出:

WWMM

参考答案:给定字符串为:WMMW遍历字符串,位置为偶数的字符分别为第2位和第4位,分别对应字符'W'和'W'。将第2位字符'W'反转为'M',第4位字符'W'反转为'M',得到新字符串:WMWM。但是题目要求的是位置为偶数的字符反转,即只需要将第2位和第4位的字符进行反转,因此正确答案为:WWMM。

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

本题要求将字符串中位置为偶数的字符进行反转,因此只需要关注字符串中位置为偶数的字符,对它们进行反转即可。需要注意的是,字符串的位置是从1开始计数的,因此位置为偶数的字符实际上是指字符串中的第2位、第4位、第6位...等位置的字符。在遍历字符串时,我们只需要判断当前字符的位置是否为偶数,如果是,则将其反转,最后得到的就是对位置为偶数的字符反转后的字符串。在本题中,字符串为"WMMW",位置为偶数的字符是第2位和第4位的字符'W',将它们反转为'M',得到的新字符串应该是"WMWM",但是由于题目要求的是对位置为偶数的字符进行反转,因此只需要将第2位和第4位的字符进行反转,即得到最终的答案"WWMM"。

8、排名

题目描述:

某比赛有N(2≤N≤50)名选手参加,给定每名参赛选手的编号(1到N)和比赛得分(0≤得分≤100),请按照分数从高到低的顺序排序,如果分数相同就按照编号排序,编号小的排前边。

输入描述:

第一行输入一个正整数N(2≤N≤50),表示参赛人数

第二行开始,共输入N行,每行两个正整数,分别表示参赛选手的编号和比赛得分(0≤得分≤100),正整数之间以一个空格隔开

输出描述:

按照排序规则,输出N行,每行两个正整数,分别表示编号和得分,正整数之间以一个空格隔开


样例输入:

3
3 84
1 87
2 84

样例输出:

1 87
2 84
3 84

参考答案:br />```31 872 843 84```

解析:【喵呜刷题小喵解析】
根据题目要求,我们需要按照分数从高到低的顺序排序,如果分数相同就按照编号排序,编号小的排前边。

首先,我们读取输入数据,得到选手的编号和得分。然后,我们按照分数从高到低的顺序进行排序,如果分数相同,则按照编号从小到大的顺序进行排序。

对于样例输入,选手的编号和得分分别为:

* 选手3,得分84
* 选手1,得分87
* 选手2,得分84

按照分数从高到低的顺序排序,得到:

* 选手1,得分87
* 选手2,得分84
* 选手3,得分84

因此,输出结果为:

```
3
1 87
2 84
3 84
```

9、充电站

题目描述:

一条笔直的公路沿途有N(2≤N≤100)个充电站,包含起点和终点各一个。小明驾驶电动汽车要从公路的起点到达终点。

已知电动汽车充满电后可行驶的里程数D(10≤D≤10000),及N个充电站每相邻的两个充电站之间的距离,并且小明在起点第一次给电动汽车充满电。请帮助小明计算出最少充电几次才能从起点到达终点(需包含起点的第一次充电)。

 注意:

1)到达终点后不需要再充电;

2)每次充电都要充满。

例如:D = 10,N = 7,7个充电站之间的距离依次为1,3,6,8,1,4,最少需要充电3次。

第一次充电在起点(第1个充电站);

第二次充电在第4个充电站(此时行驶里程为10,刚好电量耗尽);

第三次充电在第6个充电站(此时在第二次充满电后行驶了9,剩余电量只能行驶1,距离下一充电站的距离为4,所以必须在此充电站充电)。

输入描述:

第一行输入两个正整数D(10≤D≤10000)和N(2≤N≤100),分别表示电动汽车充满电后可行驶的里程数和公路沿途充电站的个数,正整数之间以一个空格隔开

第二行输入N-1个正整数(1≤正整数≤100000),依次表示相邻两个充电站之间的距离,正整数之间以一个空格隔开

输出描述:

输出一个整数,表示电动汽车从公路的起点到达终点最少充电的次数,如果不能到达终点输出-1(需包含起点的第一次充电)。


样例输入:

10 7
1 3 6 8 1 4

样例输出:

3

参考答案:对于给定的输入,首先我们需要计算出电动汽车从起点到终点的总距离。然后,我们遍历充电站之间的距离,计算电动汽车在每个充电站充电后能够行驶的距离,直到电动汽车能够到达终点或者无法到达终点。在遍历过程中,我们记录电动汽车充电的次数。

解析:【喵呜刷题小喵解析】:
首先,我们需要理解题目的要求。题目要求计算电动汽车从起点到达终点最少需要充电的次数。电动汽车充满电后可以行驶的里程数为D,沿途有N个充电站,每相邻的两个充电站之间的距离是已知的。

在解决这个问题时,我们需要计算电动汽车从起点到终点的总距离。这可以通过累加所有相邻充电站之间的距离来实现。

然后,我们需要遍历充电站之间的距离,模拟电动汽车在每个充电站充电后能够行驶的距离。我们可以从起点开始,每次充电后,行驶一段距离,直到电动汽车能够到达终点或者无法到达终点。在遍历过程中,我们记录电动汽车充电的次数。

如果电动汽车能够到达终点,我们返回充电的次数。如果电动汽车无法到达终点,我们返回-1。

在编程实现时,我们可以使用循环来遍历充电站之间的距离,并模拟电动汽车的行驶过程。具体实现细节可能会因编程语言的不同而有所差异,但基本的思路是相似的。

需要注意的是,题目中要求每次充电都要充满,因此在计算电动汽车在每个充电站充电后能够行驶的距离时,我们需要确保电动汽车的电量足够行驶到下一个充电站。如果电量不足,我们需要在当前充电站充电。

最后,我们需要注意题目中的特殊情况,即到达终点后不需要再充电。因此,在计算充电次数时,我们需要确保电动汽车到达终点时不需要再充电。

10、猴子拿桃

题目描述:

有N筐桃子从左到右排成一排,已知每筐桃子的数量。现猴子要按照以下规则拿取桃子:

1)猴子每次拿一筐桃子,一共要拿K次桃子;

2)猴子只能按照从左到右的顺序拿取桃子,不能回头,且每次拿取桃子的数量不能少于(大于等于)上一次。

当给定桃子筐数N(1≤N≤12)及每筐桃子的数量,和要拿取桃子的次数K(1≤K≤N),请编写程序,如果有符合规则的拿取方式,输出猴子最多可以拿到的桃子数量,否则输出0。

例如:

N = 4,4筐桃子的数量从左到右依次为16,12,16,17;

K=3,猴子一共要拿3次桃子,符合规则的拿取方式有:[16,16,17],[12,16,17];

其中可拿取到最多桃子的方式是:[16,16,17],合计为49。则猴子最多可以拿到49个桃子。

输入描述:

第一行输入两个正整数N和K(1≤N≤12,1≤K≤N),分别表示桃子的筐数和一共要拿取桃子的次数,正整数之间以一个空格隔开

第二行输入N个正整数(10≤正整数≤200),从左到右依次表示每筐桃子的数量,正整数之间以一个空格隔开

输出描述:

输出一个整数,如果有符合规则的拿去方式,输出猴子最多可以拿到的桃子数量,否则输出0


样例输入:

4 3
16 12 16 17

样例输出:

49

参考答案:```#include #include #include using namespace std;int maxPeaches(int N, int K, vector& peaches) int maxPeachCount = 0;vector dp(N + 1, 0);for (int i = 1; i <= N; i++) {dp[i] = dp[i - 1] + peaches[i - 1];}for (int i = N; i >= K; i--) {int maxPeach = 0;for (int j = i; j >= K; j--) {maxPeach = max(maxPeach, dp[j] - dp[j - K] + peaches[j - 1]);}maxPeachCount = max(maxPeachCount, maxPeach);}return maxPeachCount;int main() int N, K;cin >> N >> K;vector peaches(N);for (int i = 0; i < N; i++) {cin >> peaches[i];}int result = maxPeaches(N, K, peaches);cout << result << endl;return 0;```

解析:【喵呜刷题小喵解析】:
本题可以使用动态规划的方法解决。

首先,定义一个dp数组,dp[i]表示前i筐桃子的总数量。然后,通过遍历桃子的筐数,计算dp数组。

接下来,使用两层循环,外层循环从N到K,内层循环从i到K,表示猴子拿取桃子的筐数从i到i+K-1。在内层循环中,计算猴子拿取桃子的数量,即dp[j] - dp[j - K] + peaches[j - 1],其中j表示猴子拿取桃子的筐数,peaches[j - 1]表示第j筐桃子的数量。

最后,更新最大桃子数量maxPeachCount,并返回。

在主函数中,先读入桃子的筐数N和拿取桃子的次数K,然后读入每筐桃子的数量,最后调用maxPeaches函数计算最大桃子数量,并输出结果。

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

创作类型:
原创

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

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