第14届蓝桥杯20221030选拔赛题目讲解

梁老师
梁老师 北京小升初老师~

0 人点赞了该文章 · 129 浏览





编程第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%4 = 1 L
2%4 = 2 S
3%4 = 3 C
4%4 = 0 R
5%4 = 1 L
...


两种解法

# 解法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 += 1  if i == 'B':    b += 1  if 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)    break  a += 1  b -= 1  i += 1


在此基础之上,我们再来考虑下一步需要完成的事情

  1.  多罐糖果如何处理

  2. 不能将糖果数量调整到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)    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 = 0if 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 += 1else: print(-1)




编程第5题

题目问三分钟后共有多少人为新冠患者,这道题我们拆分为三部分


  1. 输入矩阵

  2.  每次传染的方式是一样的,上传,下传,左传,右传,传播的条件是x传p

  3. 重复了三次


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)

图片


添加 家长论坛微信 



发布于 2024-04-26 15:10

免责声明:

本文由 梁老师 原创发布于 家长帮 ,著作权归作者所有。

登录一下,更多精彩内容等你发现,贡献精彩回答,参与评论互动

登录! 还没有账号?去注册

暂无评论

广告
All Rights Reserved Powered BY WeCenter V4.1.0 © 2025 京ICP备20005761号-2