历年蓝桥杯青少组Python中/高级选拔赛(STEMA)真题解析 | 2024年3月

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

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

适合人群:

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

附上汇总贴:历年蓝桥杯青少组Python中/高级选拔赛(STEMA)真题解析 | 汇总

单选题

第1题

执行print(‘1’+‘3’)语句后,输出的结果是( )。

A.13

B.1+3

B.4

D.111

【答案】:A

【解析】

两个字符的拼接

第2题

下列数据类型,不可以直接使用索引(下标)访问其元素的是( )。

A.字符串

B.列表

C.集合

D.元组

【答案】:C

【解析】

集合是一种无序不重复的数据结构,不能使用下标访问

第3题

下列函数中,哪一个可以在列表末尾添加元素?( )

A.add()

B.append()

C.pop()

D.remove()

【答案】:B

【解析】

列表使用append()在末尾追加元素

第4题

已知s=‘onnopythonno’,执行print(s.rstrip(‘on’))语句后,输出的结果是( )

A.onnopythonno

B.onnopython

C.onnopyth

D.pyth

【答案】:C

【解析】

rstrip将从右向左删除字符,s.rstrip(‘on’)即删除字符串末尾的’n’和’o’

第5题

以下选项中,哪一个不是Python3的错误或异常?( )

A.SyntaxError

B.ModuleNotFoundError

C.RuntimeError

D.UnderflowError

【答案】:D

【解析】

UnderflowError是C++的一个异常类,表示发生了算数下溢

编程题

第6题

【题目描述】

给定一个整数n,输出n个连续的y。

例如:n=5。输出5个连续的y为yyyyy。

【输入】

输入一个整数n( 1 ≤ n ≤ 20 1\le n\le 20 1n20

【输出】

输出n个连续的y

【输入样例】

5

【输出样例】

yyyyy

【代码详解】

在这里插入图片描述

n = int(input())
print(n*'y')

【运行结果】

5
yyyyy

第7题

【题目描述】

给定一个字符串,将第一个字符与最后一个字符拼接后输出(第一个字符在前面,最后一个字符在后)。

例如:字符串为"abcde",abcde的第一个字符为a,最后一个字符为e,拼接后为ae。

【输入】

输入一个长度不超过20的字符串

【输出】

输出一个字符串,表示输入字符的第一个字符与最后一个字符拼接后的结果

【输入样例】

abcde

【输出样例】

ae

【代码详解】

在这里插入图片描述

s = input()
print(s[0]+s[-1])

【运行结果】

abcde
ae

第8题

【题目描述】

给定一个整数n,将n分成两个正整数,使得两个正整数的和等于n且尽可能接近。

例如:

n=5,两个正整数的和等于5的情况下可以分成1和4或者2和3,要使两个正整数尽可能接近,将5分成2和3。

n=4,两个正整数的和等于4的情况下可以分成1和3或者2和2,要使两个正整数尽可能接近,将4分钟2和2。

【输入】

输入一个整数n( 3 ≤ n ≤ 1000 3\le n\le 1000 3n1000

【输出】

按从小到大的顺序输出两个正整数,表示按题目要求得到的结果,整数之间以一个空格隔开

【输入样例】

5

【输出样例】

2 3

【代码详解】

在这里插入图片描述

n = int(input())
print(n//2, n-n//2)

【运行结果】

5
2 3

第9题

【题目描述】

提示信息:

ABB形式的字符串:是由3个字符组成,其中后两个字符相同,第一个字符与后两个字符不同。

如:“cbb”、“q22”、"688"都是ABB形式的字符串;“abc”、“wwe”、"pop"都不是ABB形式的字符串。

子串:是指一个字符串中连续的一段字符序列。

如:字符串"HelloWorld!"中,“Hello”、“ello”、“World”、"or"都是该字符串的子串。

给定一个字符串S,请统计S中有多少个ABB形式的子串,以及多少种ABB形式的子串。

例如:S=“nnnseebbetoosee”,ABB形式的子串有see、ebb、too、see,共4个;ABB形式的不同子串有see、ebb、too,共3种。

【输入】

输入一个长度不超过100的字符串S

【输出】

输出两个整数,分别表示S中有多少个ABB形式的子串,以及多少种ABB形式的子串,整数之间以一个空格隔开

【输入样例】

nnnseebbetoosee

【输出样例】

4 3

【代码详解】

在这里插入图片描述

s = input()
cnt = 0
ls = []
# se = set()  # 创建空集合
for i in range(0, len(s)-2):
    if s[i+1]==s[i+2] and s[i]!=s[i+1]:
        ls.append(s[i:i+2+1])
print(len(ls), len(set(ls)))

【运行结果】

nnnseebbetoosee
4 3

第10题

【题目描述】

有71个大小相等个格子从左到右排成一排,编号从0到70,其中N个格子有荷叶,初始时青蛙在编号为0的格子。青蛙要按照以下规则,跳到最后一个有荷叶的格子:

1、青蛙每次最少跳1格,最多跳x格;

2、青蛙每次只能调到有荷叶的格子;

3、青蛙不能往回跳。

给定N个有荷叶的格子编号,以及青蛙每次最多可以跳的格子数x,请计算青蛙一共有多少种不同的方式跳到最后一个有荷叶的格子,如果青蛙不能跳到最后一个由荷叶的格子,输出0。

例如:N=4,x=3,4个有荷叶的格子编号依次为1、3、4、6,青蛙每次最多跳3格;

在这里插入图片描述

第一种:先跳到编号1的格子,接着跳到编号3的格子,再跳到编号4的格子,最后跳到编号6的格子;

在这里插入图片描述

第二种:先跳到编号1个格子,再跳到编号3的格子,最后跳到编号6的格子;

在这里插入图片描述

第三种:先跳到编号1的格子,再跳到编号4的格子,最后跳到编号6的格子;

在这里插入图片描述

第四种:先跳到编号3的格子,再跳到编号4的格子,最后跳到编号6的格子;

在这里插入图片描述

第五种:先跳到编号3的格子,最后跳到编号6的格子。

在这里插入图片描述

青蛙一共有5种不同的方式跳到最后一个有荷叶的格子。

【输入】

第一行输入一个整数N( 3 ≤ N ≤ 30 3\le N\le 30 3N30),表示有荷叶的格子数

第二行按从小到大的方式输入N个互不相同的整数( 1 ≤ 整数 ≤ 70 1\le 整数\le 70 1整数70),表示有荷叶的格子编号,整数之间以一个空格隔开

第三行输入一个整数x( 1 ≤ x ≤ 5 1\le x \le 5 1x5),表示青蛙每次最多可以跳的格子数

【输出】

输出一个整数,表示青蛙一共有多少种不同的方式跳到最后一个有荷叶的格子

【输入样例】

4
1 3 4 6
3

【输出样例】

5

【代码详解】

在这里插入图片描述

n = int(input())
ls = [int(i) for i in input().split()]
a = [0 for i in range(70+1)]
a[0] = 1
for i in range(len(ls)):
    a[ls[i]] = 1
# print(a)
dp = [0 for i in range(70+1)]
x = int(input())
dp[0] = dp[1] = 1
for i in range(x, ls[n-1]+1):
    if a[i]==0:
        continue
    for j in range(i-x, i):
        if a[j]==1:
            dp[i] += dp[j]
# print(dp)
print(dp[ls[n-1]])

【运行结果】

4
1 3 4 6
3
5

第11题

【题目描述】

有一个N行N列的网格,网格里的每个格子都有一个字母,每个字母只能是p、y、t、h、o、n中的字母。

一台机器人按照以下规划移动:

1、起始位置可以选择网格中任意一个格子,起始位置的字母不一定为p;

2、每次只能向上下左右相邻的任意一个格子移动一格,并且经过的格子不能再次经过;

3、每次移动的格子中的字母必须按照以下环形的顺序,如下图所示:

在这里插入图片描述

例如:当前字母为t,那么移动的下一个格子中的字母必须为h。

给定N行N列的网格,请计算机器人最多可以经过多少个字母。

例如:N=4,4行4列的网格中的字母如左图,可经过最多字母的移动路径如右图:

在这里插入图片描述

以第三行第二列的h作为起始位置,按照h->o->n->p->y->t->h的顺序移动,机器人经过的字母最多,可以经过7个字母。

【输入】

第一行输入一个整数N( 2 ≤ N ≤ 50 2\le N\le 50 2N50),表示网格的行数和列数

接下来输入N行,每行N个字母,每个字母只能是p、y、t、h、o、n中的字母,字母之间以一个空格隔开

【输出】

输出一个整数,表示机器人最多可以经过多少个字母

【输入样例】

4
y n p p 
t o y t
n h p h
n h o t

【输出样例】

7

【代码详解】

在这里插入图片描述

n = int(input())
a = [['' for i in range(n+1)] for i in range(n+1)]
dict = {'p':0, 'y':1, 't':2, 'h':3, 'o':4, 'n':5}
dx = [-1,0,1,0]
dy = [0,1,0,-1]
for i in range(1, n+1):
    tmp = [i for i in input().split()]
    for j in range(1, n+1):
        a[i][j] = tmp[j-1]
maxn = 0

def dfs(x, y, cnt):
    global maxn
    vis[x][y] = 1
    maxn = max(maxn, cnt)
    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 (dict[a[xx][yy]]-dict[a[x][y]]+6)%6==1:
            dfs(xx, yy, cnt+1)
    return cnt


for i in range(1, n+1):
    for j in range(1, n+1):
        vis = [[0 for i in range(n + 1)] for i in range(n + 1)]
        dfs(i,j,1)
print(maxn)

【运行结果】

4
y n p p 
t o y t
n h p h
n h o t
7
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值