学习Python从娃娃抓起!记录下蓝桥杯备考学习过程中的题目,记录每一个瞬间。
附上汇总贴:历年蓝桥杯Python青少组中/高级国赛省赛真题解析 | 汇总
第6题
【题目描述】
给定一个正整数N,然后将N中各数位上的数字相乘,并输出最后的乘积。
例如:N=132,各数位相乘后的乘积为6(6=1 * 3 * 2)
【输入】
输入一个正整数N
【输出】
将N中各数位上的数字相乘,并输出最后的乘积
【输入样例】
132
【输出样例】
6
【代码详解】
s = input()
ans = 1
for i in s:
ans *= int(i)
print(ans)
【运行结果】
132
6
第7题
【题目描述】
在一根电线上落有N只小鸟,有的小鸟向左看,有的小鸟头向右看,且每只小鸟只能看到它视线前的那一只小鸟。
给定N只小鸟头的朝向,头向左看的小鸟使用小写字母“q“表示,头向右看的小鸟用小写字母”p“表示,请你四算出N只小鸟中有多少只小鸟被0只小鸟看到,多少只小鸟被1只小鸟看到,多少只小鸟被2只小鸟看到。
如图:有2只小鸟被0只小鸟看到(第3只和第6只);有2只小鸟被1只小鸟看到(第1只和第2只);有2只小鸟同时被2只小鸟看到(第4只和第5只)。
则输出三个数字分别为2,2,2。
【输入】
第一行输入一个正整数 N ( 3 ≤ N ≤ 1000 ) N (3\le N\le 1000) N(3≤N≤1000),表示有N只小鸟落在电线上
第二行输入N个字符,字符只能为“q”和“p”,“q”表示小鸟头向左看,“p”表示小鸟头向右看,字符之间以一个英文逗号隔开
【输出】
一行输出三个整数,分别为有几只小鸟被0只小鸟看到;有几只小鸟被1只小鸟看到;有几只小鸟被2只小鸟看到;整数之间一个英文逗号隔开
【输入样例】
6
p,q,p,p,q,q
【输出样例】
2,2,2
【代码详解】
n = int(input())
a = ['' for i in range(1005)]
ls = [i for i in input().split(',')]
for i in range(1, n+1):
a[i] = ls[i-1]
# print(a[:10])
ans = [0 for i in range(3)]
for i in range(1, n+1):
if i==1:
if a[i+1]=='p':
ans[0] += 1
if a[i+1]=='q':
ans[1] += 1
elif i==n:
if a[i-1]=='p':
ans[1] += 1
if a[i-1]=='q':
ans[0] += 1
else:
if a[i-1]=='p' and a[i+1]=='q':
ans[2] += 1
elif a[i-1]=='q' and a[i+1]=='p':
ans[0] += 1
else:
ans[1] += 1
tmp = ""
for i in range(len(ans)):
tmp += str(ans[i]) + ','
print(tmp[:-1])
【运行结果】
6
p,q,p,p,q,q
2,2,2
第8题
【题目描述】
某班级男生人数为X人,女生人数为Y人,现全班同学围成一个圆圈,并按照顺时针方向为每名同学编号(编号从1到X+Y)。现给出一个正整数K【2<K<(X+Y)】,从编号为1的同学开始顺时针方向报数,报到K的同学退出圆圈,下一名同学继续从1报数,再次报到K的同学退出圆圈。如此循环,直到剩余人数为X时游戏结束。
请你计算出游戏开始时X名男生分别应该排在什么位置,才能保证每次离开的都是女生,游戏结束时剩余X人都是男生。并将游戏开始时每名男生的位置编号按照从小到大顺序输出。
例如:X=5,Y=3,K=3,8名同学按照如下顺序排列,可以使3轮报数过后最后剩余的5名同学都为男生(蓝色为男生位置,红色为女生位置)。
故5名男同学的编号分别为2,4,5,7,8。
【输入】
输入三个正整数X,Y,K( 3 ≤ X ≤ 100 , 3 ≤ Y ≤ 100 , 2 < K < ( X + Y ) 3\le X\le 100, 3\le Y\le 100, 2\lt K\lt (X+Y) 3≤X≤100,3≤Y≤100,2<K<(X+Y)),X表示男生人数,Y表示女生人数,报数为K的同学退出圆圈,三个正整数之间以一个空格隔开
【输出】
将每名男生位置编号按照从小到大的顺序输出,编号之间以一个空格隔开
【输入样例】
5 3 3
【输出样例】
2 4 5 7 8
【代码详解】
x, y, k = [int(i) for i in input().split()]
n = x+y
a = [1 for i in range(n)]
c = -1
while True:
if a.count(0)==y:
break
for i in range(1, k+1): # 约瑟夫环的板子
c = (c+1)%n
while a[c]==0:
c = (c+1)%n
a[c] = 0
for i in range(len(a)):
if a[i]!=0:
print(i+1, end=' ')
【运行结果】
5 3 3
2 4 5 7 8
第9题
【题目描述】
老师要奖励N名成绩优秀的同学,首先N名同学按随机顺序排成一排,且每名同学都对应一个成绩(成绩各不相同),然后按照如下规则进行奖励。
规则:
1)每名同学至少奖励1支铅笔;
2)每一名同学拿到铅笔后,都会和左右相邻的同学做比较,如果相邻的同学成绩比自己高,那么铅笔也一定笔自己多,如果相邻的同学成绩比自己低,那么铅笔数一定比自己少。(注意每个人成绩都不同)
例如:
当N=3,3名同学的成绩分别为:91,92,94
如果3名同学的排序为:91,94,92,最少需要奖励4支铅笔(成绩为91的同学1支,成绩为94的同学2支,成绩为92的同学1支);
如果3名同学的排序为:91,92,94,最少需要奖励6支铅笔(成绩为91的同学1支,成绩为92的同学2支,成绩为94的同学3支)。
【输入】
第一行输入一个正整数N,N表示要奖励的同学数
第二行输入N个正整数,每个正整数表示一名同学的成绩(成绩各不相同),正整数之间以一个英文逗号隔开,正整数的顺序即代表学生的排序
【输出】
输出一个整数,表示N名同学最少需要奖励的铅笔数
【输入样例】
3
91,94,92
【输出样例】
4
【代码详解】
n = int(input())
a = [int(i) for i in input().split(',')]
dp = [1 for i in range(n)]
for i in range(1, n):
if a[i]>a[i-1]:
dp[i] = dp[i-1]+1
for i in range(n-2, -1, -1):
if a[i]>a[i+1]: # 无需按网上说的的dp[i]<=dp[i+1],也可以AC
dp[i] = dp[i+1]+1
print(sum(dp))
【运行结果】
3
91,94,92
4
第10题
【题目描述】
小蓝在玩翻卡片游戏,每张卡片一面写着大写字母“A”,另一面写着大写字母"B"。首先将卡片排成一个N * N的矩阵。有的卡片是A面朝上,有的卡片是B面朝上。
现给定N的值,及N * N矩阵中每张卡片的状态,请你帮助小蓝挑选一张B面的卡,翻转成A面,使得翻转后的上、下、左、右四个方向相连的A面卡片最多,并将相连最多的卡片数量输出。
例如:N=3,3 * 3的矩阵中的卡片状态如下:
选择红框内那张B面卡片,翻转为A面,可以使翻转后四个方向相连的A面卡片最多,为5张。
【输入】
第一行输入一个正整数N( 2 ≤ N ≤ 50 2\le N\le 50 2≤N≤50),表示矩阵的行数和列数
第二行开始输入N行,每行输入N个字符(‘A或者"B’),表示矩阵中卡片状态,字符之间以一个英文逗号隔开
【输出】
输出一个整数,表示翻转后矩阵中上、下、左、右四个方向相连的最多A面卡片张数
【输入样例】
3
A,B,B
A,B,A
B,A,B
【输出样例】
5
【代码详解】
n = int(input())
a = [['' for i in range(50+1)] for i in range(50+1)]
for i in range(1, n+1):
ls = [i for i in input().split(',')]
for j in range(1, n+1):
a[i][j] = ls[j-1]
maxn = 0
dx = [-1,0,1,0]
dy = [0,1,0,-1]
def dfs(x, y):
cnt = 1
vis[x][y] = 1
for i in range(4):
xx = x + dx[i]
yy = y + dy[i]
if 1<=xx<=n and 1<=yy<=n and vis[xx][yy]==0 and a[xx][yy]=='A':
cnt += dfs(xx, yy)
return cnt
for i in range(1, n+1):
for j in range(1, n+1):
if a[i][j] == 'B':
vis = [[0 for i in range(50+1)] for i in range(50+1)]
a[i][j] = 'A'
maxn = max(maxn, dfs(i, j))
a[i][j] = 'B'
print(maxn)
【运行结果】
3
A,B,B
A,B,A
B,A,B
5
第11题
【题目描述】
给出一排黑色带数字的小球(数字为0到9),和一排白色带数字的小球(数字为0到9),现从两排小球中一共选取K个小球排成一排。
要求:
1)选出的黑色小球顺序要和原来顺序一致;
2)选出的白色小球顺序要和原来顺序一致;
在满足以上要求的情况下,使得K个小球排成新的一排组成的数字最大
例如:
黑色小球的原顺序为:
白色小球的原顺序为:
K为3;
从两排小球中共选取3个小球,排成
可以组成的最大数字为654。
【输入】
第一行输入一组正整数,代表黑色小球,每个正整数范围为0到9,正整数之间以一个英文逗号隔开
第二行输入一组正整数,代表白色小球,每个正整数范围为0到9,正整数之间以一个英文逗号隔开
第三行输入一个正整数K(K小于等于所有小球的总数),表示从所有小球中共选取K个小球
【输出】
输出一个整数,表示按照要求选取K个小球后,组成的最大数字
【输入样例】
2,5,3
6,2,4,1
3
【输出样例】
654
【代码详解】
black = [int(i) for i in input().split(',')]
white = [int(i) for i in input().split(',')]
k = int(input())
# k_1 从黑球里面取多少个
# k_2 从白球里面取多少个
ans = 0
def pick(nums, k):
stack = []
drop = len(nums) - k
for num in nums:
while drop and stack and stack[-1]<num:
stack.pop()
drop -= 1
stack.append(num)
return stack[:k]
def merge(A, B):
res = ''
while A or B:
if A>B:
bigger = A
else:
bigger = B
res += str(bigger.pop(0))
return int(res)
for i in range(k+1):
if i<=len(black) and k-i<=len(white):
# print()
ans = max(ans, merge(pick(black, i), pick(white, k-i)))
print(ans)
【运行结果】
2,5,3
6,2,4,1
3
654