第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次一个循环,即:
两种解法
# 解法1
n = 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')
# 解法2
lst = ['R', 'L', 'S', 'C']
print(lst[n % 4])
解法1为基础解法,解法2为进阶解法,取余(%)得到的数值和模式名称一一对应,书写简单,代码简洁。
编程第3题
用兑换券 a,b,c来兑换玩偶,abc各一张即可兑换,问题:兑换券最多能兑换玩偶的数量是多少
分析:玩偶的数量取决于abc3种兑换券中数量最少的一种。
即需要从输入的兑换券字符串中分别获取A有几个,B有几个,C有几个。解法有两种
# 解法1
# 使用遍历字符串,判断字符串中是A,是B,是C的数量,最后对比可得
a = 0
b = 0
c = 0
for i in n:
if i == 'A':
a += 1
if i == 'B':
b += 1
if i == 'C':
c += 1
print(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为调整的次数,初始值为0
while True:
if a >= l and b <= r:
print(i)
break
a += 1
b -= 1
i += 1
在此基础之上,我们再来考虑下一步需要完成的事情
多罐糖果如何处理
不能将糖果数量调整到l和r之间(根据题意得:1<=L <= R <= 100)
多罐糖果具体是多少无法判断,是多个变量,而列表是存储变量的容器,因此,我们可以将糖果数量存入列表中。代码变形如下:
n = int(input())
# 将多个数据直接存储到lst列表中
lst = list(map(int, (input().split())))
l, r = map(int, (input().split()))
i = 0
while True:
# a为lst[0], b为lst[-1]
if lst[0] >= l and lst[-1] <= r:
print(i)
break
lst[0] += 1
lst[-1] -= 1
i += 1
此时,需要注意一个问题,若输入的糖果数量并没有排序,是乱序的怎么办?
例如两罐糖果,数量为 8 3,得出结果为
需要我们对列表进行从小到大的排序
添加代码
lst.sort() # 对列表进行从小到大排序
每次调整糖果最多的罐子和最少的罐子后,列表会重新排序,因此解决了多个罐子的问题。
那什么时候不能将糖果数量调整到l和r之间呢?
根据代码来看,我们调整的目的是让每罐糖果的数量平均,只要调整后的平均数在区间范围内,就可以调整,否则就无法调整。
将以上内容转化为代码:
"""
调整糖果数量
"""
# n罐糖果 解决方案
n = int(input())
lst = list(map(int, (input().split())))
l, r = map(int, (input().split()))
i = 0
if l <= sum(lst) / len(lst) <= r:
while True:
lst.sort()
print(lst)
if lst[0] >= l and lst[-1] <= r:
print(i)
break
lst[0] += 1
lst[-1] -= 1
i += 1
else:
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 = 0
for i in y:
p += i.count('x')
print(p)

添加 家长论坛微信
全部 0条评论