蓝桥杯史上最详细Python解析(十四届)

目录

  • 一、选择题(共5道)
    • 1、(4.0分)下列选项中,哪一个不是集合中的内置方法?( )
    • 2、(4.0分)已知s = "hello python",则s[1: 8]表示的是( )。
    • 3、(4.0分)执行print(23 / 10)语句后,输出的结果是( )。
    • 4、(4.0分)下列函数中,哪一个可以生成随机小数?( )
    • 5、(4.0分)下列关于列表描述不正确的是( )。
  • 二、编程题(共5道)
    • 第一题 15.0分
    • 第二题 18.0分
    • 第三题 20.0分
    • 第四题 25.0分
    • 第五题 30.0分

一、选择题(共5道)

1、(4.0分)下列选项中,哪一个不是集合中的内置方法?( )

A. isdisjoint ( )
B. copy ( )
C. string ( )
D. issubset ( )
答案:C
解析:
copy ( ) 能复制集合里面的所有元素 ,返回一个浅复制;issubset ( ) 判断集合是不是包含其他集合,等同于a>=b;isdisjoint ( ) 判断两个集合是不是不相交。A、B、D均是集合的内置方法,故选C。

2、(4.0分)已知s = “hello python”,则s[1: 8]表示的是( )。

A. hello py
B. hello p
C. ello py
D. ello p
答案:C
解析:字符串的切片格式为s[起点索引: 终点索引 + 1]。起点索引为1,对应的字母为e;起点索引为7,对应的字母为y,故切出字符串"ello py",选择C。

3、(4.0分)执行print(23 / 10)语句后,输出的结果是( )。

A. 2
B. 2.3
C. 3
D. 23
答案:B
解析:“/”表示除法运算符,运算结果一定为浮点数。23 除以 10的结果为2.3,故选B。

4、(4.0分)下列函数中,哪一个可以生成随机小数?( )

A. randint ( )
B. randrange ( )
C. shuffle ( )
D. random ( )
答案:D
解析:randint(a, b)表示随机生成一个a~b范围内的整数;randrange(a, b, step)表示随机生成一个a~b之间指定步长范围内的整数;shuffle ( )的功能是随机打乱列表元素顺序。A、B、C都不具有生成随机小数的功能。random ( )功能是生成一个0到1范围内的随机浮点数,故选D。

5、(4.0分)下列关于列表描述不正确的是( )。

A. 列表中的元素可以使用下标/索引访问
B. 列表中的元素可以使用del语句删除
C. 使用add方法可以向列表中添加元素
D. 列表是包含0个或者多个对象引用的有序序列
答案:C
解析:del 是 Python 中的关键字,专门用来执行删除操作,它不仅可以删除整个列表,还可以删除列表中的某些元素,B选项正确。向列表中添加元素的方法是append,故C选项错误,选择C。

二、编程题(共5道)

第一题 15.0分

题目描述:
(注.input ( )输入函数的括号中不允许添加任何信息)
编程实现:
给定整数N(-1000≤N≤1000),输出比N大1的数。
例如:N = 5,比5大1的数是6,则输出6。
输入描述
输入一个整数N(-1000≤N≤1000)
输出描述
输出一个整数,表示比N大1的数
样例输入
5
样例输出
6
参考代码:

n = int(input())
print(n + 1)

第二题 18.0分

题目描述:
(注.input ( )输入函数的括号中不允许添加任何信息)
编程实现:
给定一个正整数N(10≤N≤10000),输出N中所有数位上最小的数字。
例如:N = 1182,1182各数位上的数字分别为1、1、8、2,其中数位上最小的数字为1,则输出1。
输入描述
输入一个正整数N(10≤N≤10000)
输出描述
输出一个整数,表示N中所有数位上最小的数字
样例输入
1182
样例输出
1
解析
方法1:可以使用字符串的方式获取正整数的每一位数。将每一位上的数字转换成整数类型后,添加入一个列表,使用min ( )函数即可。
方法2:可以直接对字符串使用min ( )函数,返回最小ASCII码的字符(‘0’ < ‘1’ < ‘2’ …)。
参考代码:

#方法一
n = input()
ls = []
for x in n:
	ls.append(int(x))
print(min(ls))

#方法二
n = input
print(min(n))

第三题 20.0分

题目描述:
(注.input ( )输入函数的括号中不允许添加任何信息)
编程实现:
给定一组整数数据(不超过100个整数),按顺序完成以下操作并输出结果。
操作要求:
1)将数据中的所有负整数转化为正整数;
2)对转化后的数据进行从小到大排序。
例如:
整数数据为1,-3,6,-2,将负整数转化为正整数后得到1,3,6,2,按数值从小到大排序后的结果为1,2,3,6。
输入描述
输入一行整数数据(-100≤N≤100),整数之间以一个英文逗号隔开
输出描述
输出一行整数数据,表示按照要求操作后的结果,整数之间以一个英文逗号隔开
样例输入
1,-3,6,-2
样例输出
1,2,3,6
解析
根据题意,首先使用for循环对列表遍历修改,abs ( )绝对值函数可以将负整数转化为正整数。然后使用sorted ( )对列表进行排序。最后根据输出格式要求,使用 单独输出最后一个元素 或 字符串拼接 的办法,实现多数据一行逗号隔开的输出形式。
参考代码

#方法一
ls = [int(i) for i in input().split(",")]
for i in range(len(ls)):
	ls[i] = abs(ls[i])
ls = sorted(ls)
for i in range(len(ls) - 1):
	print(ls[i], end=",")
print(ls[-1])

#方法二
ls = [abs(int(i)) for i in input().split(",")]
ls = sorted(ls)
res = ""
for n in ls:
	res += str(n) + ","
print(res[:-1])

第四题 25.0分

(注:输入输出描述及样例可能和真题存在出入,仅供参考)
题目描述:
(注.input ( )输入函数的括号中不允许添加任何信息)
编程实现:
假设果园中有N(1≤N≤100)种水果。猴子想要采摘一些水果带回家,但猴子采摘水果的总重量不能超过W(1≤W≤1000)。
已知每种水果的最大采摘数量Ni(1≤Ni≤100)、每种水果单个的重量Wi(1≤Wi≤100)以及每种水果单个的维生素含量Vi(1≤Vi≤100)。在采摘水果的总重量不超过W的情况下,猴子最多可以获得多少维生素。
例如:N = 3,W = 5,表示有3种水果,且猴子采摘水果的总重量不能超过5。
每种水果的最大采摘量Ni、每种水果单个的重量Wi及每种水果单个的维生素含量Vi,如下表:
蓝桥杯史上最详细Python解析(十四届)_第1张图片

第一种水果拿3个,第二种水果拿1个,第三种水果不拿,总体积为5,最大可获得维生素含量为3 * 2 + 4 * 1 = 10。
输入描述
第一行输入两个正整数表示N,W,数字之间以空格隔开
接下来N行,每行输入3个正整数,分别表示Ni,Wi,Vi,数字之间以空格隔开
输出描述
输出一个数,表示在采摘水果的总重量不超过W的情况下,猴子最多可以获得多少维生素
样例输入
3 5
4 1 2
1 2 4
2 1 1
样例输出
10
解析
本题为多维背包问题,即背包中每种物体数量为有限多个,由输入数组给出。解决该问题可用个数较多的物品进行捆绑,变成多种物品,由01背包、完全背包演变而来。
参考代码

N, W = [int(i) for i in input().split()]
Ni = []
Wi = []
Vi = []
for i in range(N):
	ls = [int(i) for i in input().split()]
	Ni.append(ls[0])
	Wi.append(ls[1])
	Vi.append(ls[2])
F = [0 for i in range(0, w + 1)]

def ComoleteBackPack(w, v):
	for i in range(w, w + 1)
		F[i] = max(F[i], F[i-w] + v)

def OneZeroBackPack(w, v):
	for i in range(W, w - 1, -1):
		F[i] = max(F[i], F[i-w] + v)

def MultipleBackPack(w, v, n):
	if w * n >= w:
		ComoleteBackPack(Wi[i], Vi[i])
		return
	temp_n = 1
	while temp_n < n:
		OneZeroBackPack(temp_n * w, temp_n * v)
		n -= temp_n
		temp_n *= 2
	OneZeroBackPack(n * w, n * v)

for i in range(0, N):
	MultipleBackPack(Wi[i], Vi[i], Ni[i])

print(F[w])		

第五题 30.0分

(注:输入输出描述及样例可能和真题存在出入,仅供参考)
题目描述:
(注.input ( )输入函数的括号中不允许添加任何信息)
编程实现:
两名宇航员在探索一个未知行星,行星上有一些障碍物,这些障碍物用数字1表示,没有障碍物用数字0表示。行星被表示成一个N*M的矩阵。探索过程中两名宇航员走散了。已知A宇航员的位置(x1,y1)和B宇航员的位置(x2,y2),请你帮助A宇航员找到一条最短路径到达B宇航员的位置,并输出最短路径的长度(不包括起点)。
注意:
1.x1、x2表示矩阵的行号,y1、y2表示矩阵的列号;
2.左上角的位置为(0,0);
3.A、B宇航员的位置只能在数字0上;
4.有障碍物的位置不能通过。
例如:当 N=4,M=5,x1=1,y1=0,x2=3,y2=3,A宇航员的位置(1,0),B宇航员的位置(3,3),矩阵表示如下:
蓝桥杯史上最详细Python解析(十四届)_第2张图片

其中,从A到B的最短路线用箭头表示,最短路线长度为7。
输入描述
第一行输入两个正整数N,M,正整数之间以空格隔开
接下来的N行,每行输入M个数,数字1表示障碍物,数字0表示没有障碍物,数字之间以空格隔开
第N+2行输入四个整数,分别表示x1,y1,x2,y2,整数之间以空格隔开
输出描述
输出一个数,表示A宇航员到达B宇航员位置的最短路径的长度(不包括起点)
样例输入
4 5
0 0 0 0 0
0 1 0 1 0
0 1 0 0 0
0 0 1 0 0
1 0 3 3
样例输出
7
解析
本题使用了广度优先搜索算法(BFS),搜索从起点到终点的最短路径。
参考代码

n, m = [int(i) for i in input().split()]
ls = [[int(i) for i in input().split()] for i in range(n)]
x1, y1, x2, y2 = [int(i) for i in input().split()]

vis = [[x1][y1]] = 1
queue = [[x1, y1, 0]]
d = [(1, 0), (-1, 0), (0, -1), (0, 1)]

while len(queue) > 0:
	x, y = queue[0][0], queue[0][1]
	#print(queue)
	if x == x2 and y == y2:
		print(queue[-1][2])
		break
	for dx, dy in d:
		xx = x + dx
		yy = y + dy
		if 0 <= xx < n and 0 <= yy < m and vis[xx][yy] == 0 and ls[xx][yy] == 0:
			queue.append([xx, yy, queue[0][2] + 1)
			vis[xx][yy] = 1
	
	queue.pop(0)

你可能感兴趣的:(python,蓝桥杯,算法)