image

编辑人: 沉寂于曾经

calendar2025-06-13

message1

visits254

第15届蓝桥杯C++青少组中级组选拔赛(STEMA)2024年3月10日真题答案及解析

一、单选题

1、(110010)2+(c3)16的结果是(    )。

A、

(240)10

B、

(11110101)2

C、

(366)8

D、

(f6)16

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

首先,我们需要将(110010)2和(c3)16转换为十进制数。

(110010)2转换为十进制数为:
$110010_2 = 1 \times 2^5 + 1 \times 2^4 + 0 \times 2^3 + 0 \times 2^2 + 1 \times 2^1 + 0 \times 2^0 = 50_{10}$

(c3)16转换为十进制数为:
$c3_{16} = c \times 16^1 + 3 \times 16^0 = 192 + 3 = 195_{10}$

接着,将两个十进制数相加:
$50_{10} + 195_{10} = 245_{10}$

最后,将245转换为十六进制数:
$245_{10} = f5_{16}$

但是题目中要求的是(110010)2 + (c3)16的结果,所以我们需要找到与f5相等的十六进制数,即f6。

因此,答案是(f6)16。

2、表达式1000/3的结果是(    )。

A、

333

B、

333.3

C、

334

D、

333.0

解析:【喵呜刷题小喵解析】:题目要求计算1000/3的结果,根据整数除法,结果为333。所以,选项C是正确答案。其他选项都不是正确的计算结果。

3、下列选项中,判断a等于1并且b等于1正确的表达式是(    )。

A !((a!=1)&&(b!=1))

B !((a!=1)||(b!=1))

C !(a==1)&&(b==1)

D (a=1)&&(b=1)

解析:【喵呜刷题小喵解析】首先,我们需要理解题目的要求,题目要求找出一个判断a等于1并且b等于1的表达式。

A选项:`!((a!=1)&&(b!=1))`
这个表达式的意思是“a不等于1并且b不等于1”的否定,即“a等于1或者b等于1”,这与题目要求不符。

B选项:`!((a!=1)||(b!=1))`
这个表达式的意思是“a不等于1或者b不等于1”的否定,即“a等于1并且b等于1”,这与题目要求相符。

C选项:`!(a==1)&&(b==1)`
这个表达式的语法有误,应为`!((a==1)&&(b==1))`,它的意思是“a等于1并且b等于1”的否定,即“a不等于1或者b不等于1”,这与题目要求不符。

D选项:`(a=1)&&(b=1)`
这个表达式的语法也有误,应为`(a==1)&&(b==1)`,它的意思是将1赋值给a和b,而不是判断a是否等于1并且b是否等于1,这与题目要求不符。

因此,正确答案是B选项。

4、定义 char a[]="His name is Jack",请问 sizeof(a)的结果是(    )。

A 14

B 15

C 16

D 17

解析:【喵呜刷题小喵解析】在C语言中,sizeof操作符用于获取其操作数的大小(以字节为单位)。对于字符数组,sizeof返回的是整个数组的大小,包括所有字符以及结尾的空字符'\0'。在这个例子中,字符串"His name is Jack"有13个字符,加上结尾的空字符'\0',总共是14个字符。每个字符在C语言中通常占用1个字节,所以sizeof(a)的结果是14。因此,正确答案是B。

5、定义 int a[]={5,1,3,8,2,9,0,6},*p=(a+3),那么((*p)-- + *p )的值是(    )。

A、

3

B、

10

C、

15

D、

16

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

首先,定义了一个整型数组`int a[]={5,1,3,8,2,9,0,6}`,然后定义了一个指向整型数组的指针`*p=(a+3)`。

这里,`p`指向了数组的第4个元素,即`p`指向了`8`。

然后,表达式`(*p)-- + *p`中,`(*p)--`是先取`*p`的值,然后再对`*p`进行自减操作。所以,`(*p)--`的值是`8`,`*p`的值变为`7`。

接着,`(*p)-- + *p`变为`8 + 7 = 15`。

所以,`((*p)-- + *p)`的值是`15`,选项C正确。

二、实操题

6、寒假期间小明需要做完n张试卷,但他每天最多能做完m 张,请计算出小明做完n张试卷最少需要多少天?

输入描述

一行输入两个整数n和m(1≤n≤100,1≤m≤10),分别表示要完成的试卷张数,及每天最多能做完的试卷张数,整数之间以一个空格隔开

输出描述

输出一个整数,表示小明最少多少天能做完n张试卷


样例输入

10 3

样例输出

4

参考答案:```pythonn, m = map(int, input().split())days = n // mif n % m != 0:days += 1print(days)```

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

这个问题可以通过简单的除法和取余运算来解决。首先,我们需要计算小明每天完成m张试卷后,需要多少天才能完成n张试卷。这可以通过将n除以m得到,即days = n // m。

然而,如果n不能被m整除,那么小明还需要额外的一天来完成剩余的试卷。因此,我们需要检查n % m是否等于0。如果不等于0,那么days需要加1。

最后,我们将days打印出来,即为小明最少需要多少天来完成n张试卷。

7、给定两个整数a,b,请统计a到b之间(包含a和b)有多少个包含数字7的回文数。

例如:a=6,b=80,6到80之间的回文数有6、7、8、 9、11、22、33、44、55、66、77,其中有2个回文数包含7(7和77)。

输入描述

一行输入两个整数a和b(1≤a≤b≤100000),整数之间以一个空格隔开

输出描述

输出一个整数,表示a到b之间(包含a和b)包含数字7的回文数的个数


样例输入

6 80

样例输出

2

参考答案:首先,我们需要编写一个函数来判断一个数是否为回文数,并且包含数字7。然后,遍历从a到b的所有整数,对于每个整数,调用该函数进行判断,统计满足条件的回文数的个数。

解析:【喵呜刷题小喵解析】:
本题要求统计a到b之间(包含a和b)有多少个包含数字7的回文数。我们可以采用暴力解法,即遍历从a到b的所有整数,对于每个整数,判断它是否为回文数并且包含数字7。

具体来说,我们可以编写一个函数来判断一个数是否为回文数。然后,对于从a到b的每个整数,都调用这个函数进行判断,如果该数是回文数并且包含数字7,则将计数器加1。最后,返回计数器的值即为满足条件的回文数的个数。

需要注意的是,为了避免重复计算,我们可以将已经判断过的数记录下来,避免重复判断。此外,为了优化算法,我们还可以采用一些技巧,如预处理回文数的倍数等。但是,由于本题的数据范围较小,暴力解法已经足够解决问题,因此我们可以直接采用暴力解法。

8、ABB形式的字符串:是由3个字符组成,其中后两个字符相同,第一个字符与后两个字符不同。

如:"cbb"、"q22"、"688"都是 ABB 形式的字符串;

   "abc"、"wwe"、"pop"都不是 ABB 形式的字符串。

子串:是指一个字符串中连续的一段字符序列。

如:字符串“Hello,World!"

中,"Hello"、"ello"、"World"、"or"都是该字符串的子串。

编程实现:

给定一个字符串S,请统计S中有多少个ABB形式的子串, 以及多少种ABB形式的子串。

例如:S=“nnnseebbetoosee”,ABB形式的子串有see、 ebb、too、see,共4个;不同子串有see、ebb、too,共3种。

输入描述

输入一个长度不超过100的字符串S

输出描述

输出两个整数,分别表示S中有多少个ABB形式的子串,以及多少种ABB形式的子串,整数之间以一个空格隔开


样例输入

nnnseebbetoosee

样例输出

4 3

参考答案:4 3

解析:【喵呜刷题小喵解析】:
这道题目要求统计给定字符串S中有多少个ABB形式的子串,以及多少种ABB形式的子串。

首先,我们需要明确什么是ABB形式的字符串。ABB形式的字符串是由3个字符组成,其中后两个字符相同,第一个字符与后两个字符不同。例如,"cbb"、"q22"、"688"都是ABB形式的字符串。

接下来,我们需要遍历字符串S,找到所有满足ABB形式的子串。我们可以使用滑动窗口的方法,固定窗口大小为3,然后遍历字符串S,找到所有满足条件的子串。

具体实现步骤如下:

1. 初始化计数器count和set,分别用于统计ABB形式的子串个数和不同子串的种数。
2. 遍历字符串S,对于每个位置i,以i为起始位置,向右扩展长度为3的子串。
3. 判断子串是否满足ABB形式,即第一个字符与后两个字符不同,后两个字符相同。
4. 如果满足条件,将子串添加到set中,并增加count的计数。
5. 返回count和set的大小。

对于输入字符串"nnnseebbetoosee",我们可以按照上述步骤进行统计。最终得到的结果为:4个ABB形式的子串,3种不同的子串。

9、给定一个由n个整数组成的数列,请将其分割成左右两部分, 要求左半部分子数列的和与右半部分子数列的和最接近,请输出这两部分子数列和的差值(取非负值)。

例如:n=5,数列中的5个整数分别是2、1、3、4、3,将其分割成左右两部分,左半部分是2、1、3,右半部分是4、 3;此时两部分子数列的和最接近,差值为1。

输入描述

第一行输入一个整数n(2≤n≤100000)

第二行输入n个整数(1≤整数≤1000),整数之间以一个空格隔开

输出描述

输出一个整数,表示这两部分子数列和的差值(取非负值)


样例输入

5
2 1 3 4 3

样例输出

1

参考答案:本题要求将数列分割成左右两部分,使得两部分子数列的和最接近,并输出这两部分子数列和的差值。思路:1. 计算整个数列的和sum。2. 遍历数列,以i为分割点,将数列分为左右两部分。3. 计算左右两部分子数列的和,记为left_sum和right_sum。4. 计算left_sum和right_sum的差值,记为diff。5. 更新最小差值min_diff,初始值为正无穷大。6. 遍历结束后,输出min_diff。具体实现:1. 读入n和数列。2. 计算整个数列的和sum。3. 遍历数列,以i为分割点,计算left_sum和right_sum。4. 计算diff,更新min_diff。5. 遍历结束后,输出min_diff。

解析:【喵呜刷题小喵解析】:
本题是一道经典的动态规划问题,可以使用动态规划算法来解决。

首先,我们可以计算出整个数列的和sum,这样我们就可以通过计算左右两部分子数列的和,来得到它们的差值。

然后,我们可以遍历数列,以i为分割点,将数列分为左右两部分。对于每个分割点i,我们可以计算出左半部分子数列的和left_sum和右半部分子数列的和right_sum,然后计算它们的差值diff。

为了得到最小的差值,我们需要更新最小差值min_diff,初始值为正无穷大。每次计算出一个新的差值diff时,我们将其与min_diff比较,如果diff小于min_diff,则更新min_diff为diff。

最后,当遍历结束后,我们就可以输出最小差值min_diff,即为所求的答案。

需要注意的是,由于题目要求输出非负值,因此在计算差值时,我们需要取绝对值。另外,由于题目要求输出整数,因此在输出时,我们需要将结果向下取整。

10、给定一个正整数n,请将n中的每位数字重新排列并组成一个新数,要求新数的值要小于n,请找出所有符合要求的新数中最大的那个正整数,如果不存在这样的正整数,则输出-1。

例1:n=312,312中每位上的数字依次是3、1、2,重新排列组成的新数有321、231、213、132、123,新数中小于312的有231、213、132、123,其中符合要求的最大正整数是231;

例2:n=123,123中每位上的数字依次是1、2、3,重新排列组成的新数有312、321、231、213、132,新数中不存在小于123的正整数,故输出-1。

输入描述

输入一个正整数 n (1≤ n <2的63次方)

输出描述

输出一个正整数,表示符合要求的最大正整数


样例输入

312

样例输出

231

参考答案:对于给定的正整数n,我们需要找到所有小于n的由n的各位数字重新排列得到的新数中最大的那个。首先,我们需要将n的每一位数字提取出来,并存储在一个数组中。然后,我们可以使用全排列算法生成所有可能的排列。在生成排列时,我们需要维护一个当前排列的整数,并检查它是否小于n。如果找到一个符合条件的排列,我们就更新最大数。如果找不到符合条件的排列,我们输出-1。

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

这个题目的核心思路是使用全排列算法,同时检查每个排列是否满足条件。由于我们需要找到符合条件的最大数,因此我们在生成排列的过程中,每次找到一个符合条件的数,都将其与当前最大数进行比较,如果它比当前最大数大,就更新最大数。

具体来说,我们可以按照以下步骤来解题:

1. 将n的每一位数字提取出来,存储在一个数组中。
2. 使用全排列算法生成所有可能的排列。
3. 对于每个排列,检查它是否小于n,如果小于n,则更新最大数。
4. 如果找不到符合条件的排列,输出-1。

需要注意的是,由于n可能非常大,我们需要使用一种高效的算法来生成排列。一种常用的方法是使用回溯算法,每次从剩下的数字中选择一个数字,然后递归地生成剩余数字的排列。这样可以保证生成的排列是完整的,并且不会重复生成相同的排列。

另外,由于n可能非常大,我们需要使用一种高效的方式来比较两个数的大小。一种常用的方法是使用字符串比较,将两个数转换为字符串,然后比较它们的字典序大小。这样可以避免使用乘法和除法运算,从而提高效率。

11、靶场上有n块靶排成一排,从左到右依次编号为1、2、3、….n,且每块靶上都标有一个整数。

当某块靶被击中后,击中者会得到 x * y * z 的积分。( y 表示被击中的靶上的数,x表示其左侧最近且未被击中的靶上的数,z表示其右侧最近且未被击中的靶上的数。如果其左侧不存在未被击中的靶,则x为1;如果其右侧不存在未被击中的靶,则z为1。)

计算完积分后,这块靶就会退出靶场(不在这排靶中)。

请计算击中所有靶后能得到的最高积分是多少?

例如:n=4,表示有4块靶,这4块靶上的数从左到右分别是3、2、4、6;

按照下列顺序打靶,可以得到最高积分:

1.打2号靶,得到的积分是24(3*2*4);

2.打3号靶,得到的积分是72(3*4*6);

3.打1号靶,得到的积分是18(1*3*6);

4.打4号靶,得到的积分是6(1*6*1);

最终获得的积分是120(24+72+18+6)。

输入描述

第一行输入一个整数n(1≤n≤300),表示靶场上靶的数量

第二行输入n个整数(1≤整数≤100),分别表示从左到右每块靶上的数,整数之间以一个空格隔开

输出描述

输出一个整数,表示击中所有靶后能得到的最高积分


样例输入

4
3 2 4 6

样例输出

120

参考答案:```#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];}long long total_score = 0;vector left_max(n, 0);vector right_max(n, 0);left_max[0] = nums[0];for (int i = 1; i < n; i++) {left_max[i] = max(left_max[i - 1], nums[i]);}right_max[n - 1] = nums[n - 1];for (int i = n - 2; i >= 0; i--) {right_max[i] = max(right_max[i + 1], nums[i]);}for (int i = 0; i < n; i++) {long long score = (i == 0 ? 1 : left_max[i - 1]) * nums[i] * (i == n - 1 ? 1 : right_max[i + 1]);total_score += score;}cout << total_score << endl;return 0;```

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

这个问题可以通过动态规划来解决。首先,我们需要计算每个位置左侧和右侧的最大值,以便计算击中该靶时的积分。

我们可以定义两个数组`left_max`和`right_max`,其中`left_max[i]`表示第`i`个位置左侧未被击中的靶的最大值,`right_max[i]`表示第`i`个位置右侧未被击中的靶的最大值。

然后,我们可以遍历每个位置,计算击中该靶时的积分,并将其累加到总积分中。击中第`i`个靶时的积分为`(i == 0 ? 1 : left_max[i - 1]) * nums[i] * (i == n - 1 ? 1 : right_max[i + 1])`,其中`(i == 0 ? 1 : left_max[i - 1])`表示第`i`个靶左侧未被击中的靶的最大值,`nums[i]`表示第`i`个靶上的数,`(i == n - 1 ? 1 : right_max[i + 1])`表示第`i`个靶右侧未被击中的靶的最大值。

最后,输出总积分即可。

注意,由于积分的值可能很大,我们需要使用`long long`类型来存储积分。

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

创作类型:
原创

本文链接:第15届蓝桥杯C++青少组中级组选拔赛(STEMA)2024年3月10日真题答案及解析

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