image

编辑人: 青衫烟雨

calendar2025-06-12

message2

visits343

第13届蓝桥杯C++青少组中/高级组选拔赛2022年3月13日真题答案及解析

一、实操题

1、字母转换

题目描述:

给定一个大写字母,输出其对应的小写字母。

输入描述:

输入一个大写字母

输出描述:

输出大写字母对应的小写字母。


样例输入:

A

样例输出:

a

参考答案:根据题目描述,输入一个大写字母,输出其对应的小写字母。因此,输入字母"A"时,输出字母"a"。

解析:【喵呜刷题小喵解析】:
根据ASCII码表,大写字母A的ASCII码值为65,小写字母a的ASCII码值为97。由于ASCII码表中大写字母和小写字母是连续的,因此可以通过将大写字母的ASCII码值加上32来得到对应的小写字母的ASCII码值。因此,将输入的大写字母的ASCII码值加上32,即可得到对应的小写字母的ASCII码值,再将其转换为字符输出即可。

2、数位求和

题目描述:

给定两个正整数N和M(N<M),统计N到M之间(包含N和M)的正整数中,各个位上的数字之和为8的有多少个。

如:N=100,M=150,100到150之间有5个数,各个位上的数字之和为8。分别是107、116、125、134、143。

输入描述:

输入两个正整数N和M(10O≤N<M≤8O1),且正整数之间以一个空格隔开。

输出描述:

输出一个整数,表示N到M之间(包含N和M)的正整数中有多少个各个位上的数字之和为8。


样例输入:

100 150

样例输出:

5

参考答案:```pythondef digit_sum_8(n, m):count = 0for i in range(n, m+1):if sum(int(digit) for digit in str(i)) == 8:count += 1return countn, m = map(int, input().split())print(digit_sum_8(n, m))```

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

本题要求统计在给定范围N到M之间的正整数中,各个位上的数字之和为8的数的个数。

首先,我们需要编写一个函数`digit_sum_8`,接受两个参数n和m,然后遍历从n到m的所有整数,检查每个数的各个位上的数字之和是否为8,如果是,则计数器加1。最后返回计数器的值。

在主程序中,我们读取输入的两个整数n和m,然后调用`digit_sum_8`函数,并打印结果。

具体实现中,我们使用`map`函数将输入的字符串转换为整数,使用`split`函数将输入的字符串按照空格分割,使用`range`函数生成从n到m的整数序列,使用`sum`函数计算一个数的各个位上的数字之和,使用`if`语句判断条件,使用`print`函数输出结果。

3、分糖果

题目描述:

有N个小朋友从左到右排成一排,每个小朋友手中都有一定数量的糖果,且糖果总数量是N的倍数。计算出最少调整几次可以使每个小朋友的糖果数量相同。调整规则如下:

规则1:每个小朋友的糖果只能调整到左右相邻的两个小朋友手中;

规则2:第一个小朋友的糖果只能调整到第二个小朋友手中;

规则3:最后一个小朋友的糖果,只能调整到倒数第二个小朋友手中。

例如:N等于3时,1~3号小朋友原有糖果数量分别为6,4,2。

1)1号小朋友拿出两块给2号小朋友;

2)2号小朋友拿出两块给3号小朋友;

两次操作后三个小朋友手中糖果分别为4,4,4。即按照调整规则最少操作2次可以使3个小朋友手中糖果数量都相同。

现按照顺序给出1~N号小朋友手中原有糖果数量,按照调整规则计算出最少调整几次可以使小朋友手中的糖果数量都相同。

输入描述:

第一行输入一个正整数N(N<50),表示有N个小朋友

第二行输入N个正整数(1<正整数<100),表示1到N号小朋友手中原有糖果数量,正整数之间以一个空格隔开,且所有正整数之和是N的倍数

输出描述:

输出一个正整数,表示按照调整规则最少调整几次可以使小朋友手中的糖果数量都相同。


样例输入:

3
642

样例输出:

2

参考答案:```#include #include #include using namespace std;int minOperations(int N, vector& candies) int total = 0;for (int i = 0; i < N; i++) {total += candies[i];}int target = total / N;int operations = 0;for (int i = 0; i < N - 1; i++) {int diff = abs(candies[i] - candies[i + 1]);operations += (diff - 1) / 2;candies[i + 1] += min(diff, candies[i]);candies[i] -= min(diff, candies[i]);}int lastDiff = abs(candies[N - 1] - target);operations += lastDiff / 2;candies[N - 2] += min(lastDiff, candies[N - 1]);candies[N - 1] -= min(lastDiff, candies[N - 1]);return operations;int main() int N;cin >> N;vector candies(N);for (int i = 0; i < N; i++) {cin >> candies[i];}cout << minOperations(N, candies) << endl;return 0;```

解析:【喵呜刷题小喵解析】:
这个问题要求找到一个调整糖果数量的最小次数,使得每个小朋友的糖果数量相同。根据题目给出的规则,每个小朋友的糖果只能调整到左右相邻的两个小朋友手中,第一个小朋友的糖果只能调整到第二个小朋友手中,最后一个小朋友的糖果只能调整到倒数第二个小朋友手中。

首先,我们需要计算每个小朋友的糖果数量的平均值,即目标糖果数量。然后,我们遍历每个小朋友,计算当前小朋友和相邻小朋友的糖果数量差,并根据规则调整糖果数量。对于第一个小朋友,由于规则限制,我们直接将糖果调整到第二个小朋友手中,对于最后一个小朋友,我们也直接将糖果调整到倒数第二个小朋友手中。对于其他小朋友,我们将糖果数量差的一半(向下取整)分配给左右两个相邻的小朋友。

最后,我们返回糖果调整的次数。在遍历过程中,我们累加了糖果调整的次数。由于每个小朋友的糖果数量差最多为99,因此每个小朋友最多调整49次,总共最多调整49*(N-1)次。但实际上,由于糖果数量差会逐渐减小,所以调整次数远小于这个值。

以上是一个C++的解决方案,实现了输入、处理和输出的功能。在主函数中,我们首先读取小朋友的数量和每个小朋友的糖果数量,然后调用minOperations函数计算最少调整次数,并输出结果。

4、猴子摘桃子

题目描述:

果园有M行N列套数,每棵书上有一定数量的桃子。猴子从左上角的桃树开始进入果园摘桃子,每到一个桃树下都会将树上的桃子摘完,但猴子每次只能移动到当前所在桃树的下边或右边的桃树下摘桃子,照这个移动方案,猴子在果园中最多可以摘到多少桃子。

现给出M和N的值,以及每棵桃树上的桃子数量,照移动方案,计算出猴子在果园最多可以摘到多少桃子。

例如:M=2 ,N=3 

桃子数量为 

2 3 1

1 4 2

这种情况下,为了摘到最多的桃子,猴子摘桃子的顺序应为2,3,4,2,总桃子数为11。

输入描述:

第一行输入正整数 M和N,分别代表行数和列数 。

之后输入M行N列每课桃树上的桃子数量。

输出描述:

一个正整数,代表猴子按移动规则在果园中最多可以摘到多少桃子。


输入样例:

2 3
2 3 1
1 4 2

输出样例:

11

参考答案:```pythondef max_peaches(M, N, peaches):# 初始化动态规划数组dp = [[0] * (N + 1) for _ in range(M + 1)]# 初始化第一行和第一列for i in range(1, M + 1):dp[i][1] = dp[i - 1][1] + peaches[i - 1][0]for j in range(1, N + 1):dp[1][j] = dp[1][j - 1] + peaches[0][j - 1]# 填充动态规划数组for i in range(2, M + 1):for j in range(2, N + 1):dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]) + peaches[i - 1][j - 1]# 返回右下角元素return dp[M][N]# 输入M, N = map(int, input().split())peaches = []for _ in range(M):row = list(map(int, input().split()))peaches.append(row)# 输出print(max_peaches(M, N, peaches))```

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

这是一个经典的动态规划问题。首先,我们定义一个二维数组 `dp`,其中 `dp[i][j]` 表示从第一行第一列开始,到第 `i` 行第 `j` 列的桃树所能摘到的最大桃子数。

对于第一行和第一列,猴子只能向右或向下移动,所以 `dp[i][1]` 等于 `dp[i-1][1]` 加上当前桃树上的桃子数,`dp[1][j]` 等于 `dp[1][j-1]` 加上当前桃树上的桃子数。

对于其他位置,猴子可以选择向上或向左移动,所以 `dp[i][j]` 等于 `dp[i-1][j]` 和 `dp[i][j-1]` 中的较大值,再加上当前桃树上的桃子数。

最后,返回 `dp[M][N]`,即右下角位置的值,即为猴子在果园中最多可以摘到的桃子数。

5、最大值

题目描述:

给定一个正整数M(1≤M≤5)和一个只包含数字的字符串(5<字符串长度≤20)。使用M个乘号插入到字符串中,且两个乘号不能相邻,插入后生成一个乘法算式。找出一种使乘法算式数值最大的插入方式,并将结果输出。  (乘号不能放在字符串的首尾位置)

如M=2,字符串为123456,插入2个乘号。插入方式有:

1*2*3456=6912,1*23*456=10488,1*234*56=13104,1*2345*6=14070,12*3*456=16416,12*34*56=22848,12*345*6=24840,123*4*56=27552,123*45*6=33210,1234*5*6=37020,

其中乘法算式数值最大是第十种,为37020。

输入描述:

第一行输入一个正整数M(1≤M≤5),表示乘号个数。

第二行输入一个只包含数字的字符串(5<字符串长度≤20),表示要插入M个乘号的字符串。

输出描述:

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


样例输入:

2
123456

样例输出:

37020

参考答案:最大乘积数值为37020。

解析:【喵呜刷题小喵解析】:
对于这个问题,我们可以使用动态规划来解决。首先,我们定义一个二维数组dp,其中dp[i][j]表示在字符串的前i个字符中插入j个乘号所能得到的最大乘积。

我们可以从字符串的第二个字符开始遍历,对于每个字符,我们考虑将其放在当前位置,或者将其放在当前位置之前的一个乘号后面。如果我们将字符放在当前位置,那么我们需要考虑在前面的字符中插入j-1个乘号,即dp[k][j-1],其中k
对于每个字符,我们需要找到最大的乘积,即max(dp[k][j-1]*num[i], dp[k][j]*(num[k+1]-num[i+1])),其中num[i]表示字符串的第i个字符所代表的数字。

最后,dp[n][m]即为所求的最大乘积,其中n为字符串的长度,m为乘号的个数。

对于样例输入,我们可以得到最大乘积为37020。

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

创作类型:
原创

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

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