历年蓝桥杯Python青少组中/高级国赛省赛真题解析 | 2022年5月(国赛)编程题(6-11)

学习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(3N1000),表示有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) 3X100,3Y100,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 2N50),表示矩阵的行数和列数

第二行开始输入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
  • 14
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值