前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >第十四届蓝桥杯青少组省赛Python中级真题题解

第十四届蓝桥杯青少组省赛Python中级真题题解

作者头像
楚客追梦
发布2023-05-16 20:25:42
1.7K0
发布2023-05-16 20:25:42
举报
文章被收录于专栏:网页杂谈网页杂谈

Python和C++都晋级了,但是由于两个项目是同一时间考试,本想放弃Python考C++,让机构帮忙报名C++,结果报成了Python,好在Python也在学习,只有将错就错了。

单选题

1. 执行以下代码,输出的结果是 ( A )。

py

代码语言:javascript
复制
lst="abc"
print(lst+lst)

*选择题严禁使用程序验证,选择题不答或答错都不扣分 A. abcabc B.abc C. lst+lst D. abc+abc

2. 导入random标准库,执行print(random.randrange(2,20,2))语句,可能输出的结果是 ( A )。 *选择题严禁使用程序验证,选择题不答或答错都不扣分 A. 2 B. 5 C. 13 D. 20

3. 执行以下代码,输出的结果是 ( D ) 。

py

代码语言:javascript
复制
age=[16,18.7)
print(type(sorted(age)))

*选择题严禁使用程序验证,选择题不答或答错都不扣分 A. <class ‘set’> B. <class ‘int’> C. <class ‘str’> D. <class ‘list’>

4. 下列选项哪一个是转为整数的函数? ( B ) *选择题严禁使用程序验证,选择题不答或答错都不扣分 A. str B. int C. float D. list

5. 以下关于Python中复数描述,错误的是 ( D )。 *选择题严禁使用程序验证,选择题不答或答错都不扣分 A. 复数可以看作二元有序浮点数(x,y) B. 实部和虚部都是浮点数 C. 虚数部分的后缀可以是“”也可以是 “J” D. 已知复数a,可以使用a.real获得虚数部分

编程题

1. 题目描述:(注input0输入函数的括号中不允许添加任何信息) 编程实现: 给定一个正整数N,计算出N+N的值。 例如: N = 4,4+4的值为8 (8=4+4) 输入描述

输入一个正整数N

输出描述

输出N+N的值

样例输入

3

样例输出

6

题解:

py

代码语言:javascript
复制
N = int(input())
print(N+N)

2. 题目描述: (注.input0输入函数的括号中不允许添加任何信息) 编程实现: 给定一个只包含小写字母的字符串S (S长度23),请输出字符串S的第一个字符和最后一个字符. 例如:当S =“abc”,abc的第一个字符为a,最后一个字符为c,故输出ac。

输入描述

输入一个只包含小写字母的字符串S (S长度23)

输出描述

输出字符串S的第一个字符和最后一个字符,两个字符之间没有空格及其他字符

样例输入

abc

样例输出

ac

题解:

py

代码语言:javascript
复制
s = input()
print(s[0]+s[-1])

3. 题目描述: (注.input0输入函数的括号中不允许添加任何信息)提示信息: 合数:合数指自然数中除了能被1和本身整除外,还能被其它正整数整除的数。 例如4,4除了能被1和4整除,还可以被2整除。

编程实现: 小明收藏了N(2SNS25)个数字币,每个数字币上都有一个面值(面值可以重复)。从数字币中任选K (2KSN)个,有多种选法,请将每次选择的数字币上的面值累加,然后解决以下两个问题。 问题1:累加的和中有多少种不同的结果; 问题2:累加的和中有多少个不同的合数。

例如: N=5,K=3,5个数字币上的面值分别为2、1、4、5、3,任选3个数字币,有10种选法,将每种选法上的面值累加: 2+1+4=7、2+1+5=8、2+1+3=6、2+4+5=11、 2+4+3=9、2+5+3=10、1+4+5=10、1+4+3=8、1+5+3=9、4+5+3=12。 其中累加的和中有7种不同的结果,分别是7、8、6、11、9、10、12 累加的和中有5个不同的合数,分别是8、6、9、10、12 输入描述

第一行输入一个正整数N (2N<25) ,表示数字币的个数第二行输入N个正整数 (1正整数1000) ,表示数字币上的面值,正整数之间以一个英文逗号隔开第三行输入一个正整数K (2KN),表示所要选取的数字市个数

输出描述

输出两个整数,分别表示累加的和中不同结果的个数以及累加的结果中不同合数的个数,两个整数之间以一个英文逗号隔开

样例输入

5 2,1,4,5,3

样例输出

7,5

题解:

py

代码语言:javascript
复制
N = int(input())
nums = list(map(int, input().split(',')))
K = int(input())

all = set()
def plus(ns,rst):
    if len(rst) == K:
        all.add(sum(rst))
        rst.clear()
    if len(ns) < K:
        return
    for i in range(len(ns)):
        ns1 = ns.copy()
        rst1 = rst.copy()
        rst1.append(ns1.pop(i)) 
        plus(ns1,rst1)
plus(nums,[ ])

hs = 0
def checkPN(pn):
    for i in range(2,pn//2+1):
        if pn % i == 0:
            return 1
    return 0
for it in all:
    hs += checkPN(it)

rst = [str(len(all)),str(hs)]

print(",".join(rst))
[/code]


4. 题目描述
(注.input()输入函数的括号中不允许添加任何信息)
提示信息:
杨辉三角就是一个用数排列起来的三角形(如下图),杨辉三角规则如下:
1)每行第一个数和最后一个数都为1,其它每个数等于它左上方和右上方的两数之和;
2)第n行有n个数。
注意:“列”指的是如图所标注的斜列。


编程实现:
小青对杨辉三角的特点和规律研究得很明白,现要考察你对杨辉三角的熟悉程度,首先告知你这是一个N行的杨辉三角,然后又告知了两个数值X和Y(X表示第几行,Y表示第几列),让你根据杨辉三角的特点和观察到的规律解决以下两个问题
1) 第X行第Y列对应的数是多少;
2)求出N行的杨辉三角中第Y列中所有数的和。
例如: N=5,5行的杨辉三角如下图:


X=5,Y=3,第5行第3列对应的数为6;第3列中所有数的和为10 (10 = 6 +3 + 1)。
输入描述
第一行输入一个正整数N (2≤NS30),表示杨辉三角的行数第二行输入两个正整数X和Y (1SYSXSN),分别表示第X行和第Y列,正整数之间以一个英文逗号隔开
输出描述
输出两个整数,分别表示N行的杨辉三角中第X行Y列对应的数,及第Y列上所有数的和,两个整数之间以一个英文逗号隔开

样例输入
5
5,3
样例输出
6,10

题解:
[code title=py]
N = int(input())
X, Y = map(int, input().split(','))
#N行的杨辉三角形,用直角的杨辉三角形问题就非常明显
line = [1]
yh = [line]
for i in range(1,N):
    temp = [1]
    for j in range(1,len(line)):
        temp.append(line[j]+line[j-1])
    temp.append(1)
    yh.append(temp)
    line=temp
xyv = yh[X-1][Y-1]
ycv = 0
for i in range(Y-1,N):
    ycv += yh[i][Y-1]

rst = str(xyv), str(ycv)

print(",".join(rst))

5. 题目描述: (注.input0输入函数的括号中不允许添加任何信息)编程实现: 工人砌了一面奇特的砖墙,该墙由N列砖组成(1SN106),目每列砖的数量为Ki(1Kis104,相两列砖之间无缝院), 砖的长宽高都为1。小蓝为了美化这面墙,需要在这面墙中找到一块面积最大的矩形用于涂鸦,那么请你帮助小蓝找出最大矩形,并输出其面积 例如: N=6,表示这面墙有6列,每列砖的数量依次为3、2、1、5、6、2,如下图:

图中虚线部分是一块面积最大的矩形,其面积为10。 输入描述

第一行输入一个正整数N (1≤N106),表示这面砖墙由几列砖组成 第二行输入N个正整数Ki (1

输出描述

输出一个正整数,表示最大矩形的面积

样例输入

6 3 2 1 5 6 2

样例输出

10

题解:

py

代码语言:javascript
复制
N = int(input())
nums = list(map(int,input().split()))
#构建01矩阵
maxHigh = max(nums)
mx = []
for i in range(N):
    mx.append([1]*nums[i]+[0]*(maxHigh-nums[i]))

minHigh = min(nums)
#最大面积
maxA = minHigh * N
#分层统计
for i in range(minHigh,maxHigh):
    s = 0
    j = 0
    while j < N:
        while j < N and mx[j][i] == 0:  #定位到非0
            j += 1
        while j < N and mx[j][i] > 0:  #连续块
            s += 1
            j += 1
        if s > 0:
            tmp = s * (i+1)  #矩形面积
            if tmp > maxA:
                maxA = tmp
            s = 0
            
print(maxA)        

6. 题目描述: (注input0输入函数的括号中不允许添加任何信息)编程实现: 在一个神奇空间里有N个房间,房间从1到N编号,每个房间可能有一个或多个传送门,每个传送门都有一个编号,如果相同编号的传送门同时出现在多个房间中,表示这些房间可以互通。给定两个房间的编号A和B,请找出从房间A到达房间B最少需要经过几个传送门。 例如: N=3,3个房间中传送门的编号分别为: 房间1: 1、4、6; 房间2: 2、3、4,8; 房间3: 3、6、9. 其中房间1和房间2互通,共用4号传送门; 房间1和房间3互通,共用6号传送门; 房间2和房间3互通,共用3号传送门:

当A=1,B=2,从房间1到达房间2,共有两种路线: 路线1: 从房间1通过4号传送门进入房间2,共经过1个传送门; 路线2: 从房间1通过6号传送门进入房间3,再从房间3通过3号传送门进入房间2,共经过2个传送门 故从房间1到达房间2最少需要经过1个传送门。

输入描述

第一行输入一个正整数N (2SNS20) ,表示房间数量 接下来输入N行,每行包含多个正整数 (1正整数100),第2行到第N+1行依次表示1到N号房间内所有传送门的编号,正 整数之间以一个英文逗号隔开 最后一行输入两个正整数A和B (1SASN,1SBSN,AB),表示两个房间的编号,正整数之间以一个英文逗号隔开

输出描述

输出一个整数,表示从房间A到达房间B最少需要经过几个传送门,如果房间A不能到达房间B,则输出-1

样例输入

3 1,4,6 2,3,4,8 3,6,9 1,2

样例输出

1

题解:

py

代码语言:javascript
复制
N = int(input())
rooms = [set(input().split(',')) for i in range(N)]
A, B = map(int, input().split(','))
A, B = A-1, B-1

def checkLink(lst, tar):
    for r in lst:
        if len(r & tar) > 0: #与其中一个相连
            return True
    return False

rA = rooms[A]
rB = rooms[B]
if len(rA & rB) > 0: #A,B直通
    minR = 1
else:
    minR = -1
    sm = 0 
    #分层统计
    lst1 = [rA]
    rooms.remove(rA)
    rooms.remove(rB)
    lst2 = rooms
    while len(lst1)>0 and len(lst2)>0:
        sm += 1
        hasFound = False
        tmpLst1 = []
        tmpLst2 = []
        for r in lst2:
            if checkLink(lst1,r):
                if len(r & rB) > 0: #通B
                    sm += 1
                    hasFound = True
                    break
                else:
                    tmpLst1.append(r) #压入下层
            else:
                tmpLst2.append(r)          
        if hasFound:
            minR = sm
            break
        lst1=tmpLst1
        lst2=tmpLst2  #下一层

print(minR)    

那年 • 这天

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 单选题
  • 编程题
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档