历年蓝桥杯青少组省赛国赛Python中/高级组真题解析 | 2022年4月(省赛第二场)编程题

蓝桥杯Python真题解析与算法练习

​欢迎大家订阅我的专栏:算法题解:C++与Python实现
本专栏旨在帮助大家从基础到进阶 ,逐步提升编程能力,助力信息学竞赛备战!

专栏特色
1.经典算法练习:根据信息学竞赛大纲,精心挑选经典算法题目,提供清晰的代码实现与详细指导,帮助您夯实算法基础。
2.系统化学习路径:按照算法类别和难度分级,从基础到进阶,循序渐进,帮助您全面提升编程能力与算法思维。

适合人群:

  • 准备参加蓝桥杯、GESP、CSP-J、CSP-S等信息学竞赛的学生
  • 希望系统学习C++/Python编程的初学者
  • 想要提升算法与编程能力的编程爱好者

附上汇总贴:历年蓝桥杯青少组省赛国赛Python中/高级组真题解析 | 汇总


第6题

【题目描述】

输入两个字符串S1和S2,然后将S1和S2拼接成一个字符串并输出。

例如:S1=“ab”,S2=“cd”,拼接成一个字符串为"abcd"。

【输入】

第一行输入一个字符串S1

第二行输入一个字符串S2

【输出】

将S1和S2拼接成一个字符串并输出

【代码详解】

s1 = input()
s2 = input()
print(s1+s2)

【运行结果】

ab
cd
abcd

第7题

【题目描述】

给定一个正整数N,输出正整数N中各数位最大的那个数字。

例如:N=132,则输出3。

【输入】

输入一个正整数N

【输出】

输出正整数N钟各数位最大的那个数字

【代码详解】

n = input()
ls = list(n)
print(max(ls))

【运行结果】

132
3

第8题

【题目描述】

小青带着一根长为80厘米的竹竿去摘苹果,当伸手碰不到的苹果会借助竹竿摘苹果(竹竿碰到苹果就算摘下)。

在给出小青伸手的高度N及每个苹果离地面的高度,请你帮助小青计算出最多能够摘到多少个苹果。

例如:N=120,苹果高度分别为130,220,153,200,最多可以摘到3个苹果,高度为220的苹果即使用竹竿也摘不到。

【输入】

第一行输入一个正整数 N ( 120 ≤ N ≤ 200 ) N(120\le N\le 200) N(120N200),表示小青伸手高度(单位:厘米)

第二行输入多个正整数,表示每个苹果距离地面的高度,正整数之间以一个英文逗号隔开(单位:厘米)

【输出】

输出一个整数,表示小青最多可以摘到的苹果数

【输入样例】

120
130,220,153,200

【输出样例】

3

【代码详解】

h = int(input())
ls = [int(i) for i in input().split(",")]
ans = 0
for i in range(len(ls)):
    if h+80>=ls[i]:
        ans+=1
print(ans)

【运行结果】

120
130,220,153,200
3

第9题

【题目描述】

小马需要将N件物品从河的一岸搬运到河的另一岸,每次搬运的物品为1到3件。请问小马将N件物品全部搬运过去有多少种方案。

例如:N=3,将3件物品全部搬运过去有4种方案:

方案一:第一次搬运1件,第二次搬运1件,第三次搬运1件;

方案二:第一次搬运1件,第二次搬运2件;

方案三:第一次搬运2件,第二次搬运2件;

方案四:一次搬运3件。

【输入】

输入一个正整数N,表示需要搬运的物品数

【输出】

输出将N件物品全部搬运过去有多少种方案

【输入样例】

3

【输出样例】

4

【代码详解】

n = int(input())
dp = [0 for i in range(n+1)]
dp[0] = 1
dp[1] = 1
dp[2] = 2
for i in range(3, n+1):
    dp[i] = dp[i-1] + dp[i-2] + dp[i-3]
print(dp[n])

【运行结果】

3
4

第10题

【题目描述】

有一片海域划分为N * M个方格,其中有些海域已被污染(用0表示),有些海域没被污染(用1表示)。请问这片N * M海域中有几块是没被污染的独立海域(没被污染的独立海域是指该块海域上下左右被已污染的海域包围,且N * M以外的海域都为已被污染的海域)例如:N=4,M=5,4 * 5 的海域中,已被污染海域和没被污染的海域如下图:

在这里插入图片描述

这块4 * 5的海域,有3块海域(绿色)没被污染,因为每一块的上下左右都被污染的海域包围。

【输入】

第一行输入两个正整数N和M,N表示矩阵方格的行,M表示矩阵方格的列,N和M之间以一个英文逗号隔开

第二行开始输入N行,每行M个数字(数字只能为1或者0,1表示没被污染的海域,0表示已被污染的海域)

【输出】

输出一个整数,表示N * M的海域中有几块是没被污染的独立海域

【代码详解】

n, m = map(int, input().split(','))
ls = []
for i in range(n):
    ls.append(list(map(int, input().split(','))))
 
def dfs(ls, i, j):
    if (not 0 <= i < n) or (not 0 <= j < m) or ls[i][j] == 0:
        return
    ls[i][j] = 0
    dfs(ls, i - 1, j)
    dfs(ls, i + 1, j)
    dfs(ls, i, j - 1)
    dfs(ls, i, j + 1)
 
ans = 0
for i in range(n):
    for j in range(m):
        if ls[i][j] == 1:
            ans += 1
            dfs(ls, i, j)
 
print(ans)

【运行结果】

4,5
1,1,0,0,0
1,0,1,0,0
1,0,0,0,0
1,1,0,1,1
3

第11题

【题目描述】

有一个N * M的矩阵方阵,其中有些方格中有奖品,有些方格中没有奖品。小蓝需要从N * M的矩阵中选择一个方形区域,如果所选的正方形区域的一条对角线方格中都有奖品,其他方格都没有奖品,就会获得所选区域中的所有奖品,否则不能获得奖品。

当给出N和M的值,及N * M的矩阵方格中摆放的奖品情况

例如:N=5,M=6,奖品情况如下:

在这里插入图片描述

选择上图红色正方形区域,可以获得最多的4个奖品。

【输入】

第一行输入两个整数N和M ( 1 ≤ N ≤ 100 , 1 ≤ M ≤ 100 ) (1\le N\le 100, 1\le M\le 100) (1N100,1M100),N表示矩阵的行数,M表示矩阵的列数,两个整数之间一个空格隔开

接下来输入N行,每行包括M个0或者1(0表示方格中没有奖品,1表示方格中有奖品),0或者1之间一个空格隔开

【输出】

输出一个整数,表示最多可获得的奖品数

【输入样例】

5 6
1 0 1 0 0 0
0 1 0 1 0 0 
1 0 0 0 1 0 
0 1 0 0 0 1
1 0 1 0 0 0

【输出样例】

4

【代码详解】

n, m = map(int, input().split(' '))
ls = []
for i in range(n):
    ls.append([int(i) for i in input()[::2]])
 
def SUM(ls, start_i, start_j, r, c):
    sum_ = 0
    for i in range(start_i, r + 1):
        sum_ += sum(ls[i][min(start_j, c):max(start_j, c) + 1])
    return sum_
 
def dfsR(ls, start_i, start_j, i, j):
    if i >= n or j >= m or ls[i][j] == 0:
        return 0
    elif SUM(ls, start_i, start_j, i, j) != i - start_i + 1:
        return 0
    else:
        return dfsR(ls, start_i, start_j, i + 1, j + 1) + 1
 
def dfsL(ls, start_i, start_j, i, j):
    if i >= n or j < 0 or ls[i][j] == 0:
        return 0
    elif SUM(ls, start_i, start_j, i, j) != i - start_i + 1:
        return 0
    else:
        return dfsL(ls, start_i, start_j, i + 1, j - 1) + 1
 
res = 0
for i in range(n):
    for j in range(m):
        if ls[i][j] == 1:
            start_i, start_j = i, j
            res_r = dfsR(ls, start_i, start_j, i, j)
            res_l = dfsL(ls, start_i, start_j, i, j)
            res = max(res_r, res_l, res)
print(res)

【运行结果】

5 6
1 0 1 0 0 0
0 1 0 1 0 0 
1 0 0 0 1 0 
0 1 0 0 0 1
1 0 1 0 0 0
4
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值