image

编辑人: 青衫烟雨

calendar2025-06-15

message4

visits952

第13届蓝桥杯Python青少组_国赛_中/高级组_2022年5月29日真题答案及解析

一、单选题

1、已知:l = ['a','b','c','d','e','f','g'],执行print(l.pop(2), len(l))语句后,输出的结果是(   )。

A a 6

B a 7

C b 6

D c 6

解析:【喵呜刷题小喵解析】:在Python中,列表的索引是从0开始的。所以,`l.pop(2)`会移除列表`l`中索引为2的元素,即'c'。移除'c'后,列表`l`变为`['a', 'b', 'd', 'e', 'f', 'g']`,其长度为6。因此,`print(l.pop(2), len(l))`的输出结果是`'c' 6`,对应选项D。

2、下列表达式中,返回True的是(  )。

A 9 != 9

B 9 > 8 > 7

C 9 % 2 == 2

D True and False

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

A选项:9 != 9,这是一个比较表达式,表示9不等于9,显然这是不正确的,所以返回False。

B选项:9 > 8 > 7,这是一个逻辑表达式,表示9大于8且8大于7,这在逻辑上是正确的,但Python中的逻辑表达式不支持这样的写法,所以返回False。

C选项:9 % 2 == 2,这是一个算数表达式,表示9除以2的余数是否等于2,9除以2的余数是1,不等于2,所以返回False。

D选项:True and False,这是一个逻辑表达式,表示True和False的逻辑与,逻辑与要求两个操作数都为True时结果才为True,这里有一个False,所以返回False。

因此,没有选项返回True。但根据题目描述,题目中应该有一个选项返回True,可能是题目出错了。如果忽略题目描述的错误,那么所有选项都不应该返回True。但如果按照题目的描述,我们需要找一个返回True的选项,那么我们可以认为题目本身出错了。

3、已知:d = {'lan':1,'qiao':2,'qing':3,'shao':4},执行print(d.pop(max(d.keys()), 0))语句后,输出的结果是(  )。

A 2

B 4

C qiao

D shao

解析:【喵呜刷题小喵解析】题目中给出了一个字典`d`,其键为字符串,值为整数。`d.pop(max(d.keys()), 0)`语句的作用是,首先找到字典中键的最大值,然后尝试从字典中删除这个键对应的值。如果字典中不存在这个键,就返回0。

在这个例子中,`max(d.keys())`会返回`'shao'`,因为`'shao'`是字典中键的最大值。然后`d.pop('shao')`会从字典中删除键为`'shao'`的项,并返回其对应的值,即4。因此,`print(d.pop(max(d.keys()), 0))`会输出4,但是题目要求输出的是被删除的键,即`'shao'`,所以正确答案是D选项。

4、以下关于函数描述正确的是(  )。

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

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

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

D 函数定义后,其程序可以自动执行

解析:【喵呜刷题小喵解析】函数的定义通常在程序的适当位置,不是在程序的开头。因此选项A是错误的。函数定义后不会自动执行,需要显式地调用才能执行。所以选项D是错误的。函数体与关键字def的左对齐并不是必须的,只要缩进正确即可。因此选项C是错误的。选项B是正确的,函数定义后需要调用才能执行。

5、关于对打开文件函数open(<文件路径名>,<打开模式>)中的打开模式描述正确是(  )。

A、

‘r’表示只读模式打开文件,如果文件不存在,就会返回异常

B、

‘w’表示写模式打开文件,如果文件存在,就会在文件尾继续写

C、

‘a’表示追加模式打开文件,如果文件不存在,就返回异常

D、

‘b’表示二进制文件模式打开文件,可以单独作为open函数的参数

解析:【喵呜刷题小喵解析】:在Python中,打开文件的模式有多种,其中:

A选项:'r'表示只读模式打开文件,如果文件不存在,就会返回异常。这个描述是不准确的,实际上,如果文件不存在,'r'模式会抛出FileNotFoundError异常,而不是返回异常。

B选项:'w'表示写模式打开文件,如果文件存在,就会在文件尾继续写。这是正确的描述,'w'模式表示写模式,会清空文件内容然后开始写入,如果文件已存在,不会影响到原有内容,而是在文件末尾追加新的内容。

C选项:'a'表示追加模式打开文件,如果文件不存在,就返回异常。这个描述是不准确的,实际上,'a'模式表示追加模式,如果文件不存在,会创建文件然后开始写入,而不是返回异常。

D选项:'b'表示二进制文件模式打开文件,可以单独作为open函数的参数。这个描述也是不准确的,'b'是一个模式标志,通常与其他模式(如'r'、'w'、'a')一起使用,表示以二进制模式打开文件。

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

二、实操题

6、编程实现:

给定一个正整数N,然后将N中各数位上的数字相乘,并输出最后的乘积。

例如:N=132,各数位相乘后的乘积为6(6=1*3*2)

输入描述:

输入一个正整数N

输出描述:

将N中各数位上的数字相乘,并输出最后的乘积


样例输入:

132

样例输出:

6

参考答案:br />```pythondef multiply_digits(n):product = 1while n > 0:digit = n % 10product *= digitn //= 10return productN = int(input())print(multiply_digits(N))```

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

这道题目要求编程实现将给定的正整数N中各个数位上的数字相乘,并输出最后的乘积。

首先,我们可以定义一个函数`multiply_digits`,接收一个正整数`n`作为输入,然后使用一个循环来依次取出`n`的每一位数字,并将它们相乘。

在循环中,我们使用取模运算符`%`来取出`n`的个位数,然后使用乘法运算符`*`将个位数与当前的乘积`product`相乘,再将`n`除以10(使用整数除法`//`)来去掉个位数。

当`n`变为0时,循环结束,返回最终的乘积`product`。

在主程序中,我们调用`input()`函数获取用户输入的正整数`N`,然后调用`multiply_digits(N)`函数计算乘积,并使用`print()`函数输出结果。

例如,当输入为`132`时,程序会依次取出1、3和2,并将它们相乘,得到乘积6,然后输出结果6。

7、编程实现:

在一根电线上落有N只小鸟,有的小鸟头向左看,有的小鸟头向右看,且每只小鸟只能看到它视线前的那一只小鸟。

给定N只小鸟头的朝向,头向左看的小鸟使用小写字母“q”表示,头向右看的小鸟用小写字母“p”表示,请你计算出N只小鸟中有多少只小鸟被0只小鸟看到,多少只小鸟被1只小鸟看到,多少只小鸟被2只小鸟看到。 

例如:N=6,6只小鸟头的朝向分别为p,q,p,p,q,q。

如图:有2只小鸟被0只小鸟看到(第3只和第6只);有2只小鸟被1只小鸟看到(第1只和第2只);有2只小鸟同时被2只小鸟看到(第4只和第5只)。

则输出三个数字分别为2,2,2。

输入描述:

第一行输入一个正整数N(3≤N≤1000),表示有N只小鸟落在电线上

第二行输入N个字符,字符只能为“q”和“p”,“q”表示小鸟头向左看,“p”表示小鸟头向右看,字符之间以一个英文逗号隔开

输出描述:

一行输出三个整数,分别为有几只小鸟被0只小鸟看到;有几只小鸟被1只小鸟看到;有几只小鸟被2只小鸟看到;整数之间一个英文逗号隔开


样例输入:

6
p,q,p,p,q,q

样例输出:

2,2,2

参考答案:首先,我们定义三个变量,分别表示被0只小鸟看到、被1只小鸟看到和被2只小鸟看到的小鸟数量,初始值都为0。然后,我们遍历输入的小鸟朝向字符串,对于每个小鸟,检查其前面和后面各有一个小鸟的朝向情况。如果前面没有小鸟或者前面的小鸟朝向和当前小鸟朝向相同,那么当前小鸟被0只小鸟看到;如果前面和后面各有一个小鸟,并且这两个小鸟的朝向不同,那么当前小鸟被1只小鸟看到;如果前面和后面各有一个小鸟,并且这两个小鸟的朝向相同,那么当前小鸟被2只小鸟看到。最后,我们输出这三个变量的值。

解析:【喵呜刷题小喵解析】:
这个问题可以通过遍历小鸟朝向字符串来解决。我们需要找出哪些小鸟被0只小鸟看到,哪些小鸟被1只小鸟看到,哪些小鸟被2只小鸟看到。对于每个小鸟,我们需要检查其前面和后面各有一个小鸟的朝向情况。如果前面没有小鸟或者前面的小鸟朝向和当前小鸟朝向相同,那么当前小鸟被0只小鸟看到;如果前面和后面各有一个小鸟,并且这两个小鸟的朝向不同,那么当前小鸟被1只小鸟看到;如果前面和后面各有一个小鸟,并且这两个小鸟的朝向相同,那么当前小鸟被2只小鸟看到。最后,我们输出这三个变量的值。

具体实现时,我们可以定义一个长度为N的数组,用于记录每个小鸟被多少只小鸟看到。然后,我们遍历小鸟朝向字符串,对于每个小鸟,检查其前面和后面各有一个小鸟的朝向情况,更新对应数组的值。最后,我们遍历数组,统计被0只小鸟看到、被1只小鸟看到和被2只小鸟看到的小鸟数量,并输出结果。

需要注意的是,如果小鸟朝向字符串的开头或结尾有多余的字符,或者字符串长度小于3,那么可能会导致程序出错。因此,在实现时,我们需要对输入进行合法性检查,确保输入符合题目要求。

8、编程实现:

某班级男生人数为X人,女生人数为Y人,现全班同学围成一个圆圈,并按照顺时针方向为每名同学编号(编号从1到X+Y)。现给出一个正整数K【2<K<(X+Y)】,从编号为1的同学开始顺时针方向报数,报到K的同学退出圆圈,下一名同学继续从1报数,再次报到K的同学退出圆圈。如此循环,直到剩余人数为X时游戏结束。

请你计算出游戏开始时X名男生分别应该排在什么位置,才能保证每次离开的都是女生,游戏结束时剩余X人都是男生。并将游戏开始时每名男生的位置编号按照从小到大顺序输出。

例如:X=5,Y=3,K=3,8名同学按照如下顺序排列,可以使3轮报数过后最后剩余的5名同学都为男生(蓝色为男生位置,红色为女生位置)。

故5名男同学的编号分别为2,4,5,7,8。

输入描述:

输入三个正整数X,Y,K(3≤X≤100,3≤Y≤100,2<K<(X+Y)),X表示男生人数,Y表示女生人数,报数为K的同学退出圆圈,三个正整数之间以一个空格隔开

输出描述:

将每名男生位置编号按照从小到大的顺序输出,编号之间以一个空格隔开

 

样例输入:

5 3 3

样例输出:

2 4 5 7 8

参考答案:br />输入三个正整数X,Y,K,首先计算总人数T=X+Y,然后按照以下步骤计算男生应排的位置:1. 定义一个列表record,用于记录每个男生的位置编号。2. 定义一个变量num表示当前人数,初始化为T。3. 从1开始遍历,对于每个位置i,如果num%K==0,说明该位置是女生,跳过;否则,将位置i加入record,并将num减1。4. 当num==X时,游戏结束,输出record中的位置编号。

解析:【喵呜刷题小喵解析】
根据题目描述,每次报数为K的同学都会退出圆圈,所以女生退出的顺序是从编号能被K整除的位置开始,一直到游戏结束剩余X人。因此,男生应该排在不能被K整除的位置,才能保证每次离开的都是女生。

具体实现时,我们可以从位置1开始遍历,对于每个位置i,如果num%K==0,说明该位置是女生,跳过;否则,将位置i加入record,并将num减1。当num==X时,游戏结束,输出record中的位置编号。

需要注意的是,由于题目中要求输出位置编号按照从小到大的顺序,所以在遍历过程中,我们需要将位置编号加入record,而不是直接输出。最后,再将record中的位置编号按照从小到大的顺序输出即可。

9、编程实现:

老师要奖励N名成绩优秀的同学,首先N名同学按随机顺序排成一排,且每名同学都对应一个成绩(成绩各不相同),然后按照如下规则进行奖励。

规则:

1)每名同学至少奖励1支铅笔;

2)每一名同学拿到铅笔后,都会和左右相邻的同学作比较,如果相邻的同学成绩比自己高,那么铅笔数也一定比自己多,如果相邻的同学成绩比自己低,那么铅笔数一定比自己少。(注意每个人成绩都不同) 

当给出要奖励的同学数N,及N名同学的成绩及排序位置,请你按照规则帮助老师计算出最少需要奖励多少支铅笔。

例如:

当N=3,3名同学的成绩分别为:91,92,94

如果3名同学的排序为:91,94,92,最少需要奖励4支铅笔(成绩为91的同学1支,成绩为94的同学2支,成绩为92的同学1支);

如果3名同学的排序为:91,92,94,最少需要奖励6支铅笔(成绩为91的同学1支,成绩为92的同学2支,成绩为94的同学3支)。

输入描述:

第一行输入一个正整数N,N表示要奖励的同学数

第二行输入N个正整数,每个正整数表示一名同学的成绩(成绩各不相同),正整数之间以一个英文逗号隔开,正整数的顺序即代表学生的排序 

输出描述:

输出一个整数,表示N名同学最少需要奖励的铅笔数


样例输入:

3
91,94,92

样例输出:

4

参考答案:输入一个正整数N,表示要奖励的同学数。输入N个正整数,表示N名同学的成绩,正整数之间以一个英文逗号隔开,正整数的顺序即代表学生的排序。算法步骤:1. 根据输入的成绩数组,获取成绩的最大值max_score和最小值min_score。2. 初始化一个长度为N+2的数组dp,dp[i]表示成绩为i的同学最少需要奖励的铅笔数。3. 初始化dp[min_score] = 1,dp[max_score] = N。4. 从min_score+1到max_score-1遍历成绩数组,对于每个成绩i,根据规则2,如果i的左边成绩j比i大,则dp[i] = dp[j] + 1,否则如果i的右边成绩k比i小,则dp[i] = dp[k] + 1,否则dp[i] = dp[i-1] + 1。5. 遍历完所有成绩后,dp[max_score]即为最少需要奖励的铅笔数。

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

本题是一道经典的动态规划问题,可以使用动态规划算法来解决。

首先,根据输入的成绩数组,获取成绩的最大值max_score和最小值min_score,这是为了初始化动态规划数组dp的长度。

然后,初始化一个长度为N+2的数组dp,dp[i]表示成绩为i的同学最少需要奖励的铅笔数。根据规则1,成绩为min_score的同学至少奖励1支铅笔,所以dp[min_score] = 1。根据规则2,成绩为max_score的同学的铅笔数一定比其左右相邻的同学都多,所以dp[max_score] = N。

接下来,从min_score+1到max_score-1遍历成绩数组,对于每个成绩i,根据规则2,如果i的左边成绩j比i大,则i的铅笔数一定比j少1,所以dp[i] = dp[j] + 1;否则如果i的右边成绩k比i小,则i的铅笔数一定比k多1,所以dp[i] = dp[k] + 1;否则i的铅笔数一定比其左右相邻的同学都少1,所以dp[i] = dp[i-1] + 1。

最后,遍历完所有成绩后,dp[max_score]即为最少需要奖励的铅笔数。这是因为成绩为max_score的同学的铅笔数一定比其左右相邻的同学都多,所以最少需要奖励的铅笔数就是dp[max_score]。

10、编程实现:

小蓝在玩翻卡片游戏,每张卡片一面写着大写字母“A”,另一面写着大写字母“B”。首先将卡片排成一个N*N的矩阵。有的卡片是A面朝上,有的卡片是B面朝上。

现给定N的值,及N*N矩阵中每张卡片的状态,请你帮助小蓝挑选一张B面的卡,翻转成A面,使得翻转后的上、下、左、右四个方向相连的A面卡片最多,并将相连最多的卡片数量输出。

例如:N=3,3*3的矩阵中的卡片状态如下:

选择红框内那张B面卡片,翻转为A面,可以使翻转后四个方向相连的A面卡片最多,为5张。

输入描述:

第一行输入一个正整数N(2≤N≤50),表示矩阵的行数和列数

第二行开始输入N行,每行输入N个字符(‘A’或者‘B’),表示矩阵中卡片状态,字符之间以一个英文逗号隔开 

输出描述:

输出一个整数,表示翻转后矩阵中上、下、左、右四个方向相连的最多A面卡片张数


样例输入:

3
A,B,B
A,B,A
B,A,B

样例输出:

5

参考答案:```pythondef count_adjacent_A(matrix):N = len(matrix)directions = [(0, 1), (0, -1), (1, 0), (-1, 0)] # 右、左、下、上max_count = 0for i in range(N):for j in range(N):if matrix[i][j] == 'B':count = 0for dx, dy in directions:x, y = i + dx, j + dywhile 0 <= x < N and 0 <= y < N and matrix[x][y] == 'A':x += dxy += dycount += 1x, y = i - dx, j - dywhile 0 <= x < N and 0 <= y < N and matrix[x][y] == 'A':x -= dxy -= dycount += 1max_count = max(max_count, count)return max_countN = int(input())matrix = [list(input().split(',')) for _ in range(N)]print(count_adjacent_A(matrix))```

解析:【喵呜刷题小喵解析】:
本题是一道关于矩阵的题目,需要编程实现。首先,我们定义了一个函数`count_adjacent_A`,该函数接收一个二维字符列表`matrix`作为输入,返回翻转后矩阵中上、下、左、右四个方向相连的最多A面卡片张数。

在函数内部,我们首先获取矩阵的行数`N`,然后定义四个方向`(0, 1)`、`(0, -1)`、`(1, 0)`、`(-1, 0)`,分别表示右、左、下、上。接着,我们使用两个嵌套的循环遍历矩阵中的每个元素,如果当前元素是B,则计算以该B为中心,上下左右四个方向相连的A的数量,并更新最大数量`max_count`。

最后,我们读取输入,将输入的二维字符列表转换为列表的列表形式,并调用`count_adjacent_A`函数,输出最大数量。

样例输入对应的输出为5,符合题目要求。

11、编程实现:

给出一排黑色带数字的小球(数字为0到9),和一排白色带数字的小球(数字为0到9),现从两排小球中一共选取K个小球排成一排。

要求:

1)选出的黑色小球顺序要和原来顺序一致;

2)选出的白色小球顺序要和原来顺序一致;

在满足以上要求的情况下,使得K个小球排成新的一排组成的数字最大

例如:

黑色小球的原顺序为:

白色小球的原顺序为:

K为3;

从两排小球中共选取3个小球,排成

可以组成的最大数字为654。

输入描述:

第一行输入一组正整数,代表黑色小球,每个正整数范围为0到9,正整数之间以一个英文逗号隔开

第二行输入一组正整数,代表白色小球,每个正整数范围为0到9,正整数之间以一个英文逗号隔开

第三行输入一个正整数K(K小于等于所有小球的总数),表示从所有小球中共选取K个小球

输出描述:

输出一个整数,表示按照要求选取K个小球后,组成的最大数字

 

样例输入:

2,5,3
6,2,4,1
3

样例输出:

654

参考答案:```pythondef max_number(black_balls, white_balls, k):black_balls = list(map(int, black_balls.split(',')))white_balls = list(map(int, white_balls.split(',')))# 合并两排小球balls = black_balls + white_balls# 对小球进行排序,从大到小balls.sort(reverse=True)# 选取前k个小球selected_balls = balls[:k]# 将选取的小球按照原顺序拼接selected_str = ''i = 0for ball in black_balls:if ball == selected_balls[i]:selected_str += str(ball)i += 1for ball in white_balls:if ball == selected_balls[i]:selected_str += str(ball)i += 1# 将选取的小球组成的数字字符串转换为整数max_num = int(selected_str)return max_num# 读取输入black_balls = input().strip()white_balls = input().strip()k = int(input().strip())# 输出结果print(max_number(black_balls, white_balls, k))```

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

首先,我们需要将输入的两排小球(黑色和白色)和选取的小球数量K读入。

然后,我们需要将两排小球合并,并按照从大到小的顺序进行排序。

接着,我们选取排序后的前K个小球。

最后,我们需要将选取的小球按照原顺序拼接成一个数字字符串,并将其转换为整数,即为最大数字。

在这个问题中,我们需要注意的是,我们需要将选取的小球按照原顺序拼接,因此我们需要分别遍历黑色小球和白色小球,并将对应的小球加入到选取的小球中。

对于这个问题,我们可以使用Python语言来实现,具体实现可以参考上面的代码。

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

创作类型:
原创

本文链接:第13届蓝桥杯Python青少组_国赛_中/高级组_2022年5月29日真题答案及解析

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