image

编辑人: 人逝花落空

calendar2025-06-12

message6

visits527

第14届蓝桥杯Python青少组中/高级组选拔赛(STEMA)2023年1月15日真题答案及解析

一、单选题

1、已知x = 3,执行语句x += 5后,x的值为(   )。

A 3

B 5

C 8

D 35

解析:【喵呜刷题小喵解析】:在Python中,`+=` 是一个复合赋值运算符,表示将右侧的值加到左侧的变量上,并将结果赋值给左侧的变量。在这个问题中,`x += 5` 相当于 `x = x + 5`。已知 `x = 3`,执行 `x += 5` 后,`x` 的值变为 `3 + 5 = 8`。因此,答案是 C。

2、以下选项中,关于列表描述错误的是(   )。

A 列表是不可变的数据类型

B 列表中可以存放任意类型元素

C 列表元素可以使用负整数下标引用

D 列表是一个有序集合,没有固定大小

解析:【喵呜刷题小喵解析】在Python中,列表是一个可变的序列类型,支持添加、删除、修改等操作,所以选项A描述正确。列表可以包含任意类型的元素,包括数字、字符串、列表、字典等,所以选项B描述正确。列表的索引是从0开始的,不支持负整数下标引用,所以选项C描述错误。列表是一个有序集合,可以包含任意数量的元素,所以选项D描述正确。因此,选项C描述错误。

3、下列选项中,对turtle.circle(50 , steps=6)语句,描述正确的是(   )。

A 绘制一个半径为50像素的圆

B 绘制一个半径为50像素的6个圆

C 绘制一个半径为50像素的圆内接正六边形

D 绘制一个半径为50像素的圆和一个正六边形

解析:【喵呜刷题小喵解析】:turtle.circle(50, steps=6)语句表示绘制一个半径为50像素的圆内接正六边形。参数steps=6表示将圆分成6个等份,从而绘制出一个正六边形。因此,选项C描述正确。选项A描述的是绘制一个半径为50像素的圆,与题目要求不符;选项B描述的是绘制一个半径为50像素的6个圆,也与题目要求不符;选项D描述的是绘制一个半径为50像素的圆和一个正六边形,同样与题目要求不符。

4、下列关于Python函数的说法中,正确的是(   )。

A 函数的定义必须在程序开头

B 函数定义后需要调用才能执行

C 函数体与关键字def必须左对齐

D 函数必须有关键字return

解析:【喵呜刷题小喵解析】:
选项A错误,函数的定义在程序中任何位置都可以,不一定要在开头。
选项B正确,函数定义后需要调用才能执行,如果没有调用,函数体内的代码不会执行。
选项C错误,函数体与关键字def的缩进应该遵循Python的缩进规则,并不一定要左对齐。
选项D错误,函数并不一定要有关键字return,如果没有return语句,函数将返回None。所以,正确答案是B。

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

info = {
    '小蓝': {
        'like': ['钢琴', '吉他', '射箭'],
        'score': 100
    },
    '小青': {
        'like': ['画画', '爬山', '滑雪'],
        'score': 99
    }
}
print(info["小青"]["like"][1])

A 画画

B 爬山

C 吉他

D 99

解析:【喵呜刷题小喵解析】:在给出的字典中,'小青'的'like'列表包含三个元素,分别是'画画','爬山','滑雪'。因此,当我们试图访问`info["小青"]["like"][1]`时,返回的是列表中的第二个元素,即'爬山'。所以,正确答案是B。

二、实操题

6、编程实现:

给定两个正整数N和M(1<N<1000,1<M<1000),请计算出N与M的乘积。

输入描述:

第一行输入一个正整数N(1<N<1000)

第二行输入一个正整数M(1<M<1000)

输出描述:

输出一个正整数,表示N与M的乘积


样例输入:

2
3

样例输出:

6

参考答案:br />```pythonN = int(input())M = int(input())print(N * M)```

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

本题要求计算两个正整数N和M的乘积。根据题目描述,输入为两行,第一行输入N,第二行输入M。输出为N与M的乘积。

在Python中,可以使用`input()`函数从标准输入读取一行字符串,然后使用`int()`函数将字符串转换为整数。最后,使用`print()`函数输出计算结果。

具体实现如下:

1. 使用`input()`函数读取第一行输入,将结果赋值给变量`N`。
2. 使用`input()`函数读取第二行输入,将结果赋值给变量`M`。
3. 使用`print()`函数输出`N * M`,即N与M的乘积。

7、题目描述:

给定一个正整数N(100≤N≤999),交换N中任意两个数位上的数字获得一个新值,找到一种交换方式使得新值最大,并输出,如果交换后的新值都不大于N,则输出N。(只能交换一次)

例如:N=145,有三种交换方式,交换后的新值分别为415、541、154,其中交换后最大的新值为541,则输出541。

输入描述:

输入一个正整数N(100≤N<999)

输出描述:

输出一个正整数,表示交换后的最大值


样例输入:

145

样例输出:

541

参考答案:为了找到交换后最大的新值,我们需要确定N中的最大数字,并交换该数字与N的首位数字。

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

对于这个问题,我们可以按照以下步骤来找到交换后最大的新值:

1. 首先,我们需要找到N中的最大数字。例如,对于N=145,最大数字是5。

2. 然后,我们将找到的最大数字与N的首位数字交换。在本例中,我们交换5和1,得到新的数541。

3. 如果交换后的新值不大于N,则输出N。在本例中,541不大于145,所以不需要输出145。

因此,对于输入N=145,输出为541。

注意,由于题目要求只能交换一次,所以我们只需要找到N中的最大数字,并将其与N的首位数字交换即可。这样可以保证新值是最大的。

8、编程实现:

有N(1≤N≤100)根绳子,已知每根绳子初始的长度(1≤长度≤1000)。每根绳子都可以在任意位置裁断。

请计算出小明最多可以剪成多少根长度为K(1≤K≤200)的绳子,如果不能剪成长度为K的绳子输出0。

例如:N = 4,4根绳子初始长度为2,3,4,10,K =3,最多可以剪成5根长度为3的绳子。

第一根不能剪成;第二根可以剪成1根;第三根可以剪成1根;第四根可以剪成3根。

输入描述:

第一行输入一个正整数N(1≤N≤100),表示原有绳子的根数

第二行输入N个正整数(1≤正整数≤1000),表示每根绳子的初始长度,正整数之间以一个空格隔开

第三行输入一个正整数K(1≤K≤200),表示需要剪出的绳子长度

输出描述:

输出一个整数,表示N根绳子中最多可以剪成多少根长度为K的绳子,如果都不能剪成长度为K的绳子则输出0


样例输入:

4
2 3 4 10
3

样例输出:

5

参考答案:```pythonN, K = map(int, input().split())ropes = list(map(int, input().split()))total_length = sum(ropes)max_ropes = total_length // Kcount = 0for rope in ropes:count += min(rope // K, K)print(max(count, max_ropes))```

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

这道题目要求我们编程计算N根绳子中最多可以剪成多少根长度为K的绳子。首先,我们需要读取输入,包括绳子的数量N,每根绳子的初始长度,以及需要剪成的绳子长度K。

我们可以先计算所有绳子的总长度,然后计算最多可以剪成的绳子数量,即总长度除以K。这是一个上界,因为可能存在一些绳子无法完全剪成K长度的绳子。

接下来,我们遍历每根绳子,计算它最多可以剪成多少根K长度的绳子。具体来说,我们可以将每根绳子的长度除以K,然后取最小值,同时不超过K。这是因为如果一根绳子的长度小于K,那么它无法剪成一根K长度的绳子。

最后,我们将遍历每根绳子得到的绳子数量与上界比较,取较大值作为最终答案。如果所有绳子都无法剪成长度为K的绳子,那么最终答案就是0。

以上代码实现了这个算法,首先读取输入,然后计算总长度和最多可以剪成的绳子数量,接着遍历每根绳子计算最多可以剪成的绳子数量,最后输出最终答案。

9、编程实现:

将N(1<N<50)堆石子围成一个圆圈,已知每堆石子的数量,且石子的总数量能被N整除。请按照如下要求移动石子,使得N堆石子的数量变为相同。

要求:可以从每堆石子中拿取石子移动到它左右相邻的两堆石子堆中。

计算出要使得N堆石子的数量变为相同,至少需要移动多少颗石子。

例如:N = 3,3堆石子顺时针方向的数量依次为2、6、7。最少需要移动3颗石子,N堆石子的数量变为相同,每堆5颗。

第1次从第一堆石子中拿1颗移动到第一堆的石子中,此时3堆石子的数量依次为3、5、7;

第2次从第三堆石子中拿2颗移动到第一堆的石子中,此时3堆石子的数量依次为5、5、5。

输入描述:

第一行输入一个正整数N(1<N<50),表示石子的堆数

第二行输入N个正整数(1<正整数<100),表示顺时针方向每堆石子的原始数量,正整数之间以一个空格隔开

输出描述:

输出一个整数,表示要使N堆石子的数量变为相同,最少移动的石子数量,如果原始N堆石子数量相同,则输出0


样例输入:

3
2 6 7

样例输出:

3

参考答案:```pythondef min_moves(N, stones):total = sum(stones)target = total // Nmoves = 0curr = 0for stone in stones:curr += stone - targetif curr > 0:moves += currcurr = 0elif curr < 0:moves += abs(curr)return movesN = int(input())stones = list(map(int, input().split()))print(min_moves(N, stones))```

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

这个问题可以通过模拟来解决。首先,我们计算每堆石子的目标数量,即总数量除以堆数。然后,我们遍历每堆石子,计算当前堆的石子数量与目标数量的差值,并将差值累加到移动次数中。如果差值大于0,表示需要移动石子到相邻的堆中,移动次数增加差值;如果差值小于0,表示需要移动石子从相邻的堆中过来,移动次数增加差值的绝对值。最后,返回移动次数即可。

在Python中,我们可以定义一个函数min_moves,接受堆数N和每堆石子的数量列表stones作为参数,返回移动次数。在函数中,我们首先计算总数量和目标数量,然后遍历每堆石子,计算移动次数,最后返回移动次数。在主程序中,我们读取输入,调用min_moves函数,并输出结果。

10、编程实现:

某公园有N(3≤N≤50)棵树排成一排,已知每棵树的高度。现要去掉一些树,使得剩下树的高度从左至右呈现先递增再递减的规律(即剩余的树中仅有一棵最高的树,且它左侧的所有树中后一棵树都要比前一棵树高,它右侧的所有树中后一棵树都要比前一棵树矮)

给出N棵树的高度(高度单位:m,1.0≤每棵树高度≤100.0,保留一位小数),请你计算出最少去掉几棵树才能使这排树呈现先递增再递减的规律,如果不能呈现则输出-1(只有递增或者只有递减都为不能呈现)。

例如:N=10,10棵树的高度从左到右依次为1.0、2.3、1.2、1.7、1.1、2.0、1.8、1.8、1.2、1.9。

要使这排树呈现先递增再递减的规律,最少去掉4棵树,去掉的编号分别为2、5、8、10。

剩余树的高度依次为1.0、1.2、1.7、2.0、1.8、1.2,最高树为2.0,其左侧树的高度依次为1.0、1.2、1.7、2.0,呈现递增趋势(从左至右且包含最高树);其右侧树的高度依次为2.0、1.8、1.2,呈现递减趋势(从左至右且包含最高树)。

输入描述:

第一行输入一个正整数N(3≤N≤50),表示这排树的数量

第二行输入N个数(1.0≤每个数≤100.0,保留一位小数),表示每棵树的高度,每个数之间以一个空格隔开

输出描述:

输出一个整数,表示最少去掉几棵树才能使这排树呈现先递增再递减的规律,如果不能呈现则输出-1


样例输入:

10
1.0 2.3 1.2 1.7 1.1 2.0 1.8 1.8 1.2 1.9

样例输出:

4

参考答案:```pythonN = int(input())heights = list(map(float, input().split()))# 初始化变量left_max = heights[0]right_max = heights[0]max_idx = 0min_remove = N# 遍历树的高度for i in range(1, N):if heights[i] > left_max:left_max = heights[i]max_idx = ielif heights[N - i - 1] > right_max:right_max = heights[N - i - 1]# 检查是否满足先递增再递减的规律if left_max == right_max:print(-1)else:# 移除多余的树remove_num = 0for i in range(N):if i < max_idx:if heights[i] < heights[i + 1]:remove_num += 1else:if heights[i] > heights[i - 1]:remove_num += 1print(min(remove_num, N - max_idx - 1))```

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

本题要求找到一种方式,通过移除一些树,使得剩下的树的高度从左到右呈现先递增再递减的规律。

首先,我们需要找到最高的树的位置,记为`max_idx`。然后,我们检查是否满足先递增再递减的规律。如果最高的树左侧的所有树中后一棵树都要比前一棵树高,并且它右侧的所有树中后一棵树都要比前一棵树矮,那么我们可以尝试移除一些树来满足这个规律。

为了移除最少的树,我们可以从最高的树开始,向两侧遍历。对于左侧,如果当前树的高度小于下一棵树的高度,那么我们需要移除当前树。对于右侧,如果当前树的高度大于前一棵树的高度,那么我们需要移除当前树。

在遍历过程中,我们记录移除的树的数量,并找到最小的移除数量。同时,我们还需要注意,如果最高的树左侧或右侧没有树,那么我们不能移除任何树。

最后,我们输出最小的移除数量。如果无法满足先递增再递减的规律,我们输出-1。

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

创作类型:
原创

本文链接:第14届蓝桥杯Python青少组中/高级组选拔赛(STEMA)2023年1月15日真题答案及解析

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