第14届蓝桥杯20221030选拔赛题目讲解
编程第1题
题目要求为获取字符串中最后一个字符,可以通过索引值去获取。
索引值分为正序索引以及倒序索引,由此得两种解法。
# 解法1 正序n = input()a = len(n)print(n[a-1])
# 解法2 倒序n = input()print(n[-1])
编程第2题
空调遥控器
第1次为制冷模式,L
第2次为睡眠模式,S
第3次为除湿模式,C
第4次为制热模式,R
第5次为制冷模式,L
... 循环不止
此类型题一般使用取余(%)来解决,4次一个循环,即:
两种解法
# 解法1n = int(input())if n % 4 == 1:print('L')elif n % 4 == 2:print('S')elif n % 4 == 3:print('C')elif n % 4 == 0:print('R')
# 解法2lst = ['R', 'L', 'S', 'C']print(lst[n % 4])
解法1为基础解法,解法2为进阶解法,取余(%)得到的数值和模式名称一一对应,书写简单,代码简洁。
编程第3题
用兑换券 a,b,c来兑换玩偶,abc各一张即可兑换,问题:兑换券最多能兑换玩偶的数量是多少
分析:玩偶的数量取决于abc3种兑换券中数量最少的一种。
即需要从输入的兑换券字符串中分别获取A有几个,B有几个,C有几个。解法有两种
# 解法1# 使用遍历字符串,判断字符串中是A,是B,是C的数量,最后对比可得a = 0b = 0c = 0for i in n:if i == 'A':a += 1if i == 'B':b += 1if i == 'C':c += 1print(min(a, b, c))
# 解法2# count 统计某个字符在字符串/列表/元组中出现的次数n = input()a = n.count('A')b = n.count('B')c = n.count('C')print(min(a, b, c))
解法1为基础解法,解法2为进阶解法
编程第4题
题目大意为,有几罐糖果,糖果数量不均匀,通过指定的方式调整,使每罐糖果的数量处于某个区间。
此题难度难度有提升,为了得分,我们先完成示例效果
输入样例第1行为N罐糖果,第2行为每罐糖果的数量,第3行为要求糖果数量所在的区间,示例中n=2
n = int(input())a, b = map(int, (input().split()))l, r = map(int, (input().split()))
a, b 为 每罐糖果的数量,l,r为区间
当不满足a>l 以及 b<r的条件时,需要使 a增加1,b减少1,直到满足条件为止。
将以上内容转换为编程语言即为
i = 0 # i为调整的次数,初始值为0while True:if a >= l and b <= r:print(i)breaka += 1b -= 1i += 1
在此基础之上,我们再来考虑下一步需要完成的事情
多罐糖果如何处理
不能将糖果数量调整到l和r之间(根据题意得:1<=L <= R <= 100)
多罐糖果具体是多少无法判断,是多个变量,而列表是存储变量的容器,因此,我们可以将糖果数量存入列表中。代码变形如下:
n = int(input())# 将多个数据直接存储到lst列表中lst = list(map(int, (input().split())))l, r = map(int, (input().split()))i = 0while True:# a为lst[0], b为lst[-1]if lst[0] >= l and lst[-1] <= r:print(i)breaklst[0] += 1lst[-1] -= 1i += 1
此时,需要注意一个问题,若输入的糖果数量并没有排序,是乱序的怎么办?
例如两罐糖果,数量为 8 3,得出结果为

需要我们对列表进行从小到大的排序
添加代码
lst.sort() # 对列表进行从小到大排序
每次调整糖果最多的罐子和最少的罐子后,列表会重新排序,因此解决了多个罐子的问题。
那什么时候不能将糖果数量调整到l和r之间呢?
根据代码来看,我们调整的目的是让每罐糖果的数量平均,只要调整后的平均数在区间范围内,就可以调整,否则就无法调整。
将以上内容转化为代码:
"""调整糖果数量"""# n罐糖果 解决方案n = int(input())lst = list(map(int, (input().split())))l, r = map(int, (input().split()))i = 0if l <= sum(lst) / len(lst) <= r:while True:lst.sort()print(lst)if lst[0] >= l and lst[-1] <= r:print(i)breaklst[0] += 1lst[-1] -= 1i += 1else:print(-1)
编程第5题
题目问三分钟后共有多少人为新冠患者,这道题我们拆分为三部分
输入矩阵
每次传染的方式是一样的,上传,下传,左传,右传,传播的条件是x传p
重复了三次
n, m = map(int, input().split())x = []for i in range(m):temp = input()x.append(temp)y = []for i in x:y.append(list(i))print(y)
我们先把初始状态患者的位置做一个记录
xgc = []for i in range(m):for j in range(m):if y[i][j] == 'x':xgc.append([i, j])
传播代码为
# 上传if i > 0:if y[i - 1][j] == 'p':y[i - 1][j] = 'x'# 下传if i < m - 1:if y[i + 1][j] == 'p':y[i + 1][j] = 'x'# 左传if j > 0:if y[i][j - 1] == 'p':y[i][j - 1] = 'x'# 右传if j < m - 1:if y[i][j + 1] == 'p':y[i][j + 1] = 'x'
然后重复三次,记录y列表中x的数量即可
"""新冠病毒"""n, m = map(int, input().split())x = []for i in range(m):temp = input()x.append(temp)y = []for i in x:y.append(list(i))print(y)for z in range(n):xgc = []for i in range(m):for j in range(m):if y[i][j] == 'x':xgc.append([i, j])for c in xgc:i = c[0]j = c[1]# 上传if i > 0:if y[i - 1][j] == 'p':y[i - 1][j] = 'x'# 下传if i < m - 1:if y[i + 1][j] == 'p':y[i + 1][j] = 'x'# 左传if j > 0:if y[i][j - 1] == 'p':y[i][j - 1] = 'x'# 右传if j < m - 1:if y[i][j + 1] == 'p':y[i][j + 1] = 'x'p = 0for i in y:p += i.count('x')print(p)

添加 家长论坛微信

全部 0条评论