第十四届蓝桥杯大赛青少组中级组Python真题解析
选择题
1. 执行以下代码,输出的结果是 ( A )。
lst="abc"
print(lst+lst)
*选择题严禁使用程序验证,选择题不答或答错都不扣分
A. abcabc
B.abc
C. lst+lst
D. abc+abc
2. 导入random标准库,执行print(random.randrange(2,20,2))语句,可能输出的结果是 ( A )。
*选择题严禁使用程序验证,选择题不答或答错都不扣分
A. 2
B. 5
C. 13
D. 20
3. 执行以下代码,输出的结果是 ( D )
age=[16,18.7)
print(type(sorted(age)))
*选择题严禁使用程序验证,选择题不答或答错都不扣分
A. <class ‘set’>
B. <class ‘int’>
C. <class ‘str’>
D. <class ‘list’>
4. 下列选项哪一个是转为整数的函数? ( B )
*选择题严禁使用程序验证,选择题不答或答错都不扣分
A. str
B. int
C. float
D. list
5. 以下关于Python中复数描述,错误的是 ( D )。
*选择题严禁使用程序验证,选择题不答或答错都不扣分
A. 复数可以看作二元有序浮点数(x,y)
B. 实部和虚部都是浮点数
C. 虚数部分的后缀可以是“”也可以是 “J”
D. 已知复数a,可以使用a.real获得虚数部分
编程题
1. 题目描述:
(注input()输入函数的括号中不允许添加任何信息)
编程实现: 给定一个正整数N,计算出N+N的值。
例如: N = 4,4+4的值为8 (8=4+4)
输入描述
输入一个正整数N
输出描述
输出N+N的值
样例输入
3
样例输出
6
题解:
N = int(input())
print(N+N)
2. 题目描述:
(注.input()输入函数的括号中不允许添加任何信息)
编程实现: 给定一个只包含小写字母的字符串S (S长度23),请输出字符串S的第一个字符和最后一个字符. 例如:当S =“abc”,abc的第一个字符为a,最后一个字符为c,故输出ac。
输入描述
输入一个只包含小写字母的字符串S (S长度23)
输出描述
输出字符串S的第一个字符和最后一个字符,两个字符之间没有空格及其他字符
样例输入
abc
样例输出
ac
题解:
s = input()
print(s[0]+s[-1])
3. 题目描述:
(注.input()输入函数的括号中不允许添加任何信息)
提示信息:
合数:合数指自然数中除了能被1和本身整除外,还能被其它正整数整除的数。 例如4,4除了能被1和4整除,还可以被2整除。
编程实现: 小明收藏了N(2≤N≤25)个数字币,每个数字币上都有一个面值(面值可以重复)。从数字币中任选K (2≤K≤N)个,有多种选法,请将每次选择的数字币上的面值累加,然后解决以下两个问题。
问题1:累加的和中有多少种不同的结果;
问题2:累加的和中有多少个不同的合数。
例如: N=5,K=3,5个数字币上的面值分别为2、1、4、5、3,任选3个数字币,有10种选法,将每种选法上的面值累加: 2+1+4=7、2+1+5=8、2+1+3=6、2+4+5=11、 2+4+3=9、2+5+3=10、1+4+5=10、1+4+3=8、1+5+3=9、4+5+3=12。
其中累加的和中有7种不同的结果,分别是7、8、6、11、9、10、12,
累加的和中有5个不同的合数,分别是8、6、9、10、12。
输入描述
第一行输入一个正整数N (2≤N≤25) ,表示数字币的个数
第二行输入N个正整数 (1≤正整数≤1000) ,表示数字币上的面值,正整数之间以一个英文逗号隔开
第三行输入一个正整数K (2≤K≤N),表示所要选取的数字市个数
输出描述
输出两个整数,分别表示累加的和中不同结果的个数以及累加的结果中不同合数的个数,两个整数之间以一个英文逗号隔开
样例输入
5
2,1,4,5,3
3
样例输出
7,5
题解:
from itertools import combinations
def is_composite(num):
if num <= 1:
return False
for i in range(2, int(num ** 0.5) + 1):
if num % i == 0:
return True
return False
def main():
# 输入处理
N = int(input())
values = list(map(int, input().split(',')))
K = int(input())
# 生成所有K个数字币的组合
all_combinations = combinations(values, K)
# 计算所有组合的累加和,并存储在集合中以去重
sum_results = set()
for comb in all_combinations:
sum_results.add(sum(comb))
# 找出不同的合数
composite_count = sum(1 for s in sum_results if is_composite(s))
# 输出结果
print(f"{len(sum_results)},{composite_count}")
# 调用main函数
main()
4. 题目描述
(注.input()输入函数的括号中不允许添加任何信息)
提示信息:
杨辉三角就是一个用数排列起来的三角形(如下图),杨辉三角规则如下:
1)每行第一个数和最后一个数都为1,其它每个数等于它左上方和右上方的两数之和;
2)第n行有n个数。
注意:“列”指的是如图所标注的斜列。
编程实现:
小青对杨辉三角的特点和规律研究得很明白,现要考察你对杨辉三角的熟悉程度,首先告知你这是一个N行的杨辉三角,然后又告知了两个数值X和Y(X表示第几行,Y表示第几列),让你根据杨辉三角的特点和观察到的规律解决以下两个问题
1) 第X行第Y列对应的数是多少;
2)求出N行的杨辉三角中第Y列中所有数的和。
例如: N=5,5行的杨辉三角如下图:
X=5,Y=3,第5行第3列对应的数为6;第3列中所有数的和为10 (10 = 6 +3 + 1)。
输入描述
第一行输入一个正整数N (2≤NS30),表示杨辉三角的行数
第二行输入两个正整数X和Y (1SYSXSN),分别表示第X行和第Y列,正整数之间以一个英文逗号隔开
输出描述
输出两个整数,分别表示N行的杨辉三角中第X行Y列对应的数,及第Y列上所有数的和,两个整数之间以一个英文逗号隔开
样例输入
5
5,3
样例输出
6,10
题解:
def generate_pascals_triangle(n):
triangle = [[1] * (i + 1) for i in range(n)]
for i in range(2, n):
for j in range(1, i):
triangle[i][j] = triangle[i - 1][j - 1] + triangle[i - 1][j]
return triangle
def main():
# 输入处理
N = int(input())
X, Y = map(int, input().split(','))
# 构建杨辉三角
triangle = generate_pascals_triangle(N)
# 获取第X行第Y列的值
value_at_x_y = triangle[X - 1][Y - 1]
# 计算第Y列的所有数的和
sum_of_column_y = sum(row[Y - 1] for row in triangle if len(row) >= Y)
# 输出结果
print(f"{value_at_x_y},{sum_of_column_y}")
# 调用main函数
main()
5. 题目描述:
(注.input()输入函数的括号中不允许添加任何信息)
编程实现: 工人砌了一面奇特的砖墙,该墙由N列砖组成(1SN106),目每列砖的数量为Ki(1Kis104,相两列砖之间无缝院), 砖的长宽高都为1。
小蓝为了美化这面墙,需要在这面墙中找到一块面积最大的矩形用于涂鸦,那么请你帮助小蓝找出最大矩形,并输出其面积。
例如: N=6,表示这面墙有6列,每列砖的数量依次为3、2、1、5、6、2,如下图:
图中虚线部分是一块面积最大的矩形,其面积为10。
输入描述
第一行输入一个正整数N (1≤N≤10^6),表示这面砖墙由几列砖组成
第二行输入N个正整数Ki (1≤Ki≤10^4),依次表示每列砖的数量,正整数之间以一个空格隔开
输出描述
输出一个正整数,表示最大矩形的面积
样例输入
6
3 2 1 5 6 2
样例输出
10
题解:
def largestRectangleArea(heights):
stack = []
max_area = 0
heights.append(0) # 添加一个0值到高度列表的末尾,以便在遍历结束时处理所有柱子。
for i in range(len(heights)):
while stack and heights[i] < heights[stack[-1]]:
h = heights[stack.pop()]
w = i if not stack else i - stack[-1] - 1
max_area = max(max_area, h * w)
stack.append(i)
return max_area
def main():
# 输入处理
N = int(input().strip())
heights = list(map(int, input().strip().split()))
# 计算最大矩形面积
max_area = largestRectangleArea(heights)
# 输出结果
print(max_area)
# 调用main函数
main()
6. 题目描述:
(注input()输入函数的括号中不允许添加任何信息)
编程实现:
在一个神奇空间里有N个房间,房间从1到N编号,每个房间可能有一个或多个传送门,每个传送门都有一个编号,如果相同编号的传送门同时出现在多个房间中,表示这些房间可以互通。
给定两个房间的编号A和B,请找出从房间A到达房间B最少需要经过几个传送门。
例如: N=3,3个房间中传送门的编号分别为:
房间1: 1、4、6;
房间2: 2、3、4,8;
房间3: 3、6、9.
其中房间1和房间2互通,共用4号传送门; 房间1和房间3互通,共用6号传送门; 房间2和房间3互通,共用3号传送门:
当A=1,B=2,从房间1到达房间2,共有两种路线:
路线1: 从房间1通过4号传送门进入房间2,共经过1个传送门;
路线2: 从房间1通过6号传送门进入房间3,再从房间3通过3号传送门进入房间2,共经过2个传送门 故从房间1到达房间2最少需要经过1个传送门。
输入描述
第一行输入一个正整数N (2≤N≤20) ,表示房间数量
接下来输入N行,每行包含多个正整数 (1≤正整数≤100),第2行到第N+1行依次表示1到N号房间内所有传送门的编号,正 整数之间以一个英文逗号隔开
最后一行输入两个正整数A和B (1≤A≤N,1≤B≤N,且A≠B),表示两个房间的编号,正整数之间以一个英文逗号隔开
输出描述
输出一个整数,表示从房间A到达房间B最少需要经过几个传送门,如果房间A不能到达房间B,则输出-1
样例输入
3
1,4,6
2,3,4,8
3,6,9
1,2
样例输出
1
题解:
N = int(input())
rooms = [set(input().split(',')) for i in range(N)]
A, B = map(int, input().split(','))
A, B = A-1, B-1
def checkLink(lst, tar):
for r in lst:
if len(r & tar) > 0: #与其中一个相连
return True
return False
rA = rooms[A]
rB = rooms[B]
if len(rA & rB) > 0: #A,B直通
minR = 1
else:
minR = -1
sm = 0
#分层统计
lst1 = [rA]
rooms.remove(rA)
rooms.remove(rB)
lst2 = rooms
while len(lst1)>0 and len(lst2)>0:
sm += 1
hasFound = False
tmpLst1 = []
tmpLst2 = []
for r in lst2:
if checkLink(lst1,r):
if len(r & rB) > 0: #通B
sm += 1
hasFound = True
break
else:
tmpLst1.append(r) #压入下层
else:
tmpLst2.append(r)
if hasFound:
minR = sm
break
lst1=tmpLst1
lst2=tmpLst2 #下一层
print(minR)
本文参考了第十四届蓝桥杯青少组省赛Python中级真题题解-腾讯云开发者社区-腾讯云和百度文库
如有侵权请联系删除
作者:小芋头的初码农