锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

蓝桥杯试题及答案分享(Python版)

时间:2022-09-11 03:00:00 100pin矩形连接器

文章目录

    • 1 比赛介绍
    • 2 Python组比赛规则及说明
      • 2.1 组别
      • 2.2 竞赛赛程
      • 2.3 竞赛形式
      • 2.4 参赛者的机器环境
      • 2.5 试题形式
      • 2.6 试题考试范围试题考试范围
      • 2.7 答案提交
      • 2.8 评分
    • 3 试题及答案
      • 3.1 成绩统计
      • 3.2 FJ字符串
      • 3.3 K好数
      • 3.4 N皇后
      • 3.5 2N皇后
      • 3.6 sin之舞
      • 3.7 不同子串
      • 3.8 成绩排名
      • 3.9 承压计算
      • 3.10乘积尾零
      • 3.11 单词分析
      • 3.12 等差数列
      • 3.13 等差素数列
      • 3.14 递归倒置字符数组
      • 3.15 递增三元组
      • 3.16 幸运数
      • 3.17 调手表
      • 3.18 队列操作
      • 3.19 方格分割
      • 3.20 分解质因数
      • 3.21 分数
      • 3.22 复数求和
      • 3.23 购物单
      • 3.24 龟兔赛跑预测
      • 3.25 合根植物
      • 3.26 换钞票
      • 3.27 回形取数
      • 3.28 金陵十三钗
      • 3.29 矩阵乘法
      • 3.30 矩阵面积交
      • 3.31 矩阵求和
      • 3.32 门牌制作
      • 3.33 迷宫
      • 3.34 迷宫2
      • 3.35 年号字串
      • 3.36 跑步锻炼
      • 3.37 平面切分
      • 3.38 全球变暖
      • 3.39 蛇形填数
      • 3.40 石子游戏
      • 3.41 时间转换
      • 3.42 数的读法
      • 3.43 数的分解
      • 3.44 数列求值
      • 3.45 数量增加
      • 3.46 数字9
      • 3.47 数字三角形
      • 3.48 特别数的和
      • 3.49 特殊回文数
      • 3.50 完美的代价
      • 3.51 完全二叉树的权值
      • 3.52 晚会节目单
      • 3.53 芯片测试
      • 3.54 幸运顾客
      • 3.55 序列计数
      • 3.56 寻找2020
      • 3.57 杨辉三角
      • 3.58 叶节点数
      • 3.59 音节判断
      • 3.60 预测身高
      • 3.61 约数个数
      • 3.62 长草
      • 3.63 长整数加法
      • 3.64 装饰珠
      • 3.65 字符串操作
      • 3.66 字符串对比
      • 3.67 字符串跳步
      • 3.68 公共子序列最长(LCS)
      • 3.69 最长滑雪道
      • 3.70 最长字符序列(同LCS)

1 比赛介绍

蓝桥杯大赛的举办受到了教育部、工业和信息化部相关领导的高度重视部门和局的大力支持,也得到了省教育部和相关机构的积极响应,也得到了师生的广泛好评,学校超过 1200 余地,参赛人数已达40万,取得了良好的社会效果。

我们学校B级,国家级A级,省级一等奖可以参加国家级。所以比赛含金量高,建议大家把握好。

个人竞赛软件分类:

  • C/C 程序设计(研究生组,大学A组,B组、C组)
  • Java软件开发(研究生组,大学A组,B组、C组)
  • Python程序设计(大学组)

2 Python组比赛规则及说明

2.1 组别

本次比赛不分组。所有研究生、重点本科、普通本科、高职院校均可报名参加本组,统一获奖。

2.2 竞赛赛程

全国选拔赛时长:4 小时。
决赛时间:4 小时。
以组委会公布的信息为准。

2.3 竞赛形式

个人比赛,一人一机,整个计算机测试。玩家的机器通过局域网连接到竞争服务器。玩家不能访问互联网,也不允许使用本机以外的资源(如USB 连接)。竞赛系统以服务器浏览器的形式发布试题,回收选手答案。

2.4 参赛者的机器环境

选手机器配置:

X86兼容机不小于内存 4G ,硬盘不小于 60G
操作系统:Windows7 及以上

编程环境:

编译器:Python 3.8.6
编辑器:IDLE Python 自带编辑器

2.5 试题形式

比赛题目完全是客观题型。评分依据根据选手提交的答案进行评分。有两种类型的问题。

结果填空题

标题描述了一个有明确解决方案的问题。要求选手解决问题。
不需要解决问题的过程,不限制解决问题的方法(任何开发语言或工具,甚至手动计算),只需填写最终结果。最终的解决方案是一个整数或一个字符串,最终的解决方案可以使用ASCII 字符表达。

编程大题

主题包括明确的问题描述、输入和输出格式,以及用于解释问题的样本数据。

编程问题中涉及的问题必须有明确和客观的标准来判断结果是否正确,并且可以通过程序来判断结果。判断结果。

选手应根据问题描述编写程序(使用) Python 为了解决问题,选手的程序应该从标准输入中读取数据,并将最终结果输出到标准输出中。

在问题描述中,将明确给定的条件和限制,并明确问题的任务。参赛者的程序应能够解决给定条件和限制下的所有可能情况。在给定条件和限制下的所有可能情况。

选手的程序应该是普遍的,而不仅仅是题目的样例数据。

为了测试解决方案的性能,评分中使用的测试用例可能包含大数据量的压力测试用例。选手在选择算法时应尽可能考虑可行性和效率。

2.6 试题考试范围试题考试范围

Python程序设计基础:包含使用 Python编写程序的能力。这部分不考察选手对某种语法的理解,选手可以用自己喜欢的句子编写程序。

计算机算法:枚举、排序、搜索、计数、贪婪、动态规划、图论、数论、博弈论、概率论、计算几何、字符串算法等。

数据结构:数组、对象/结构、字符串、队列、栈、树、图、堆、平衡树结构、字符串、队列、栈、树、图、堆、平衡树/线段树、复杂数据线段树、复杂数据结构、嵌套数据结构等。

2.7 答案提交

只有在比赛时间内提交的答案才能用于评估,比赛后的任何提交都无效。

选手应使用考试指定的网页以任何其他方式提交代码(如电子邮件)U盘)不作为评价依据。

选手可以在比赛中的任何时候查看之前提交的代码,或者重新提交任何问题的答案。对于每个问题,只有最后一次提交被保存并作为评估的基础。在比赛中,评估结果不会显示给玩家,玩家应该设计数据来调试他们的程序,而不反馈。

对于每一试题,选手应将试题的答案复制粘贴到网页上提交。

Pytho程序仅可以使用Python自带的库,评测时不会安装其他的扩展库。

程序中应只包含计算模块,不要包含任何其他的模块,比如图形、系统接口调用、系统中断等。对于系统接口的调用都应通过标准库来进行。

程序中引用的库应该在程序中以源代码的方式写出,在提交时也应当和程序的其他部分一起提交。

2.8 评分

全部使用机器自动评分。对于结果填空题,题目保证只有唯一解,选手的结果只有和解完全相同才得分,出现格式错误或有多余内容时不得分。

对于编程大题,评测系统将使用多个评测数据来测试程序。每个评测数据有对应的分数。选手所提交的程序将分别用每个评测数据作为输入来运行。对于某个评测数据,如果选手程序的输出与正确答案是匹配的,则选手获得该评测数据的分数。

评测使用的评测数据一般与试题中给定的样例输入输出不一样。因此建议选手在提交程序前使用不同的数据测试自己的程序。

提交的程序应严格按照输出格式的要求来输出,包括输出空格和换行的要求。如果程序没有遵循输出格式的要求将被判定为答案错误。请注意,程序在输出的时候多输出了内容也属于没有遵循输出格式要求的一种,所以在输出的时候请不要输出任何多余的内容,比如调试输出。

3 试题及答案

试题由本人从历年搜集并附了程序解答,由于本人编程能力有限,可能有错或并非最优解,欢迎指正!

当初本人刷完题,将解答过程分享给老魏,最终老魏获得了省二(成为我心中的阴影😢),说明刷题还是有一定帮助,希望大家能认真做好每一题。

3.1 成绩统计

题目描述

小蓝给学生们组织了一场考试,卷面总分为100分,每个学生的得分都是一个0到100的整数。如果得分至少是60分,则称为及格。如果得分至少为85分,则称为优秀。请计算及格率和优秀率,用百分数表示,百分号前的部分四舍五入保留整数。

输入描述

输入的第一行包含一个整数 n (1≤n≤ 1 0 4 10^4 104),表示考试人数。接下来n行,每行包含一个0至100的整数,表示一个学生的得分。

输出描述

输出两行,每行一个百分数,分别表示及格率和优秀率。百分号前的部分四舍五入保留整数。

n = int(input())
# 及格的数量
passNum = 0
# 优秀的数量
goodNum = 0
for _ in range(n):
    score = int(input())
    if score >= 60:
        passNum += 1
    if score >= 85:
        goodNum += 1
print(str(round(passNum/n*100))+'%')
print(str(round(goodNum/n*100))+'%')

3.2 FJ字符串

题目描述

FJ在沙盘上写了这样一些字符串:

A1 = “A”

A2 = “ABA”

A3 = “ABACABA”

A4 = “ABACABADABACABA”

… …

你能找出其中的规律并写所有的数列AN吗?

输入描述

仅有一个数:N ≤ 26。

输出描述

请输出相应的字符串AN,以一个换行符结束。输出中不得含有多余的空格或换行、回车符。

输入样例

3

输出样例

ABACABA

n = int(input())
result = ''
for i in range(n):
    result = result + chr(ord('A') + i) + result
print(result)

3.3 K好数

题目描述

如果一个自然数N的K进制表示中任意的相邻的两位都不是相邻的数字,那么我们就说这个数是K好数。求L位K进制数中K好数的数目。例如K = 4,L = 2的时候,所有K好数为11、13、20、22、30、31、33 共7个。由于这个数目很大,请你输出它对1000000007取模后的值。

输入描述

输入包含两个正整数,K和L。

输出描述

输出一个整数,表示答案对1000000007取模后的值。

输入样例

4 2

输出样例

7

对于30%的数据,KL <= 106;

对于50%的数据,K <= 16, L <= 10;

对于100%的数据,1 <= K, L <= 100。

K, L = map(int, input().split())
count = 0
# dp[i][j]表示i + 1位上存放j的方法个数。
dp = [[0 for _ in range(K)] for _ in range(L)]
# 当只有一位时不管这位放哪个数字都只有一种方法
for i in range(0, K):
    dp[0][i] = 1
# 当位数大等2位时
for i in range(1, L):
    # 以2为数为例,j为十位,m为个位
    for j in range(K):
        for m in range(K):
            # 不相邻才能存放
            if abs(j - m) != 1:
                # 当前位数的放j情况的总个数 = 当前位置放j的个数 + 上一位置放[0,k)的总个数
                dp[i][j] = dp[i][j]+dp[i-1][m]
                dp[i][j] %= 1000000007
    # 不断递归下去,如三位数放k进制的个数 = 三位数的最高位(看成十位)放k进制的个数+两位数(看成一个整体为个位)放k进制的个数

# L位数K好数的总个数
# i从1开始排除L位为最高位放0的情况
for i in range(1, K):
    count += dp[L-1][i]
    count %= 1000000007
print(count)

3.4 N皇后

题目描述

在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上。
你的任务是,对于给定的N,求出有多少种合法的放置方法。

输入描述

输入N。

输出描述

输出一个整数,表示总共有多少种放法。

# 递归回溯思想解决n皇后问题,cur代表当前行,从0开始一行行遍历
def queen(A, cur=0):
    # 判断上行放置的棋子是否有问题,如果有则回退
    for row in range(cur-1): 
        # 由于是一行行遍历肯定不存在同行,只需检测是否同列和同对角线
        # 若在该列或对角线上存在其他皇后
        if A[row] - A[cur-1] == 0 or abs(A[row] - A[cur-1]) == cur - 1 - row: 
            # 该位置不能放
            return
    # 所有的皇后都正确放置完毕,输出每个皇后所在的位置
    if cur == len(A): 
        print(A)
        return
    # 行数=列数,遍历每列
    for col in range(len(A)):
        # 当前行存储皇后所在的列数
        A[cur] = col
        # 继续放下一个皇后
        queen(A, cur+1)

# n为8,就是著名的八皇后问题啦
n = int(input()) 
# 初始传入8行的数组
queen([None] * n)

3.5 2N皇后

题目描述

给定一个n*n的棋盘,棋盘中有一些位置不能放皇后。现在要向棋盘中放入n个黑皇后和n个白皇后,使任意的两个黑皇后都不在同一行、同一列或同一条对角线上,任意的两个白皇后都不在同一行、同一列或同一条对角线上。问总共有多少种放法?n小于等于8。

输入描述

输入的第一行为一个整数n,表示棋盘的大小。
接下来n行,每行n个0或1的整数,如果一个整数为1,表示对应的位置可以放皇后,如果一个整数为0,表示对应的位置不可以放皇后。

输出描述

输出一个整数,表示总共有多少种放法。

输入样例

4
1 1 1 1
1 1 1 1
1 1 1 1
1 1 1 1

输出样例

2

输入样例

4
1 0 1 1
1 1 1 1
1 1 1 1
1 1 1 1

输出样例

0

# 先放置白皇后, cur代表当前行,从0开始一行行遍历
def w_queen(cur=0):
    # 判断上行放置的棋子是否有问题,如果有则回退
    for row in range(cur-1): 
        # 由于是一行行遍历肯定不存在同行,只需检测是否同列和同对角线
        # 若在该列或对角线上存在其他皇后
        if w_pos[row] - w_pos[cur-1] == 0 or abs(w_pos[row] - w_pos[cur-1]) == cur - 1 - row: 
            # 该位置不能放
            return
    # 当前颜色皇后都正确放置完毕
    if cur == n: 
        # 放置另一种颜色的皇后
        b_queen(0)
        return
    # 遍历每列
    for col in range(n):
        # 如果该位置为1,则可以放置其子
        if chessboard[cur][col] == 1:
            # 记录该棋子存放位置
            w_pos[cur] = col
            # 继续放下一个皇后
            w_queen(cur+1)

# 再放置黑皇后,与白皇后同理
def b_queen(cur=0):
    global count
    for row in range(cur-1): 
        if b_pos[row] - b_pos[cur-1] == 0 or abs(b_pos[row] - b_pos[cur-1]) == cur - 1 - row: 
            return
    if cur == n: 
        # 两种颜色皇后放置完毕,记录次数
        count += 1
        return
    for col in range(n):
        # 如果该位置为1且没有放白皇后,则可以放置其子
        if chessboard[cur][col] == 1 and w_pos[cur] != col:
            b_pos[cur] = col
            b_queen(cur+1)

# 输入
n = int(input()) 
# 初始化棋盘
chessboard = [[] for _ in range(n)]
for i in range(n):
    arr = input().split()
    for j in range(n):
        chessboard[i].append(int(arr[j]))
# 用于记录白皇后位置
w_pos = [0 for _ in range(n)]
# 用于记录黑皇后位置
b_pos = [0 for _ in range(n)]
# 初始化多少种放法
count = 0
# 开始放置皇后
w_queen(0)
# 输出多少种放法
print(count)

3.6 sin之舞

题目描述

最近FJ为他的奶牛们开设了数学分析课,FJ知道若要学好这门课,必须有一个好的三角函数基本功。所以他准备和奶牛们做一个“Sine之舞”的游戏,寓教于乐,提高奶牛们的计算能力。
不妨设
An=sin(1–sin(2+sin(3–sin(4+…sin(n))…)
Sn=(…(A1+n)A2+n-1)A3+…+2)An+1
FJ想让奶牛们计算Sn的值,请你帮助FJ打印出Sn的完整表达式,以方便奶牛们做题。

输入描述

仅有一个数:N<201。

输出描述

请输出相应的表达式Sn,以一个换行符结束。输出中不得含有多余的空格或换行、回车符。

输入样例

3

输出样例

((sin(1)+3)sin(1–sin(2))+2)sin(1–sin(2+sin(3)))+1

def A(k, n):
    if k == n:
        return
    print('sin(%d' % (k + 1), end='')
    # 若后边还有式子,判断是输出+号还是-号
    if k + 1 != n:  
        if k % 2 == 1:
            print('+', end='')
        else:
            print('-', end='')
    # 若到底了,则输出n个')'结束
    else:  
        print(')'*n, end='')
    k += 1
    A(k, n)  # 递归调用自身

n = int(input())
for i in range(n):
    # 第一项n-1个括号开始
    if i == 0:
        print('('*(n-1), end='')
    # 后续An+n-i)
    A(0, i+1)
    print('+%d' % (n-i), end='')
    # 最后一项加完整数之和不必再输出右括号
    if i != n - 1:
        print(')', end='')

3.7 不同子串

题目描述

一个字符串的非空子串是指字符串中长度至少为1的连续的一段字符组成的串。例如,字符串aaab有非空子串a, b, aa, ab, aaa, aab, aaab,一共7个。 注意在计算时,只算本质不同的串的个数。请问,字符串0100110001010001有多少个不同的非空子串?

答案

100

str1 = '0100110001010001'
var = []
for i in range(1, len(str1)+1):
    for j in range(len(str1) - i + 1):
        if str1[j:j+i] not in var:
            var.append(str1[j:j+i])
print(len(var))

3.8 成绩排名

题目描述

小明刚经过了一次数学考试,老师由于忙碌忘记排名了,于是老师把这个光荣的任务交给了小明,小明则找到了聪明的你,希望你能帮他解决这个问题。

输入描述

第一行包含一个正整数N,表示有个人参加了考试。接下来N行,每行有一个字符串和一个正整数,分别表示人名和对应的成绩,用一个空格分隔。

输出描述

输出一共有N行,每行一个字符串,第i行的字符串表示成绩从高到低排在第i位的人的名字,若分数一样则按人名的字典序顺序从小到大。

输入样例

3
aaa 47
bbb 90
ccc 70

输出样例

bbb
ccc
aaa

人数<=100,分数<=100,人名仅包含小写字母。

n = int(input())
inf = [list(input().split()) for _ in range(n)]
information.sort(key=lambda x: x[0])  # 先排姓名,按字母顺序
information.sort(key=lambda x: int(x[1]), reverse=True)  # 后排成绩,从大到小
for i in range(n):
    print(information[i][0])

3.9 承压计算

题目描述

X星球的高科技实验室中整齐地堆放着某批珍贵金属原料。

每块金属原料的外形、尺寸完全一致,但重量不同。
金属材料被严格地堆放成金字塔形。

其中的数字代表金属块的重量(计量单位较大)。
最下一层的X代表30台极高精度的电子秤。

假设每块原料的重量都十分精确地平均落在下方的两个金属块上,
最后,所有的金属块的重量都严格精确地平分落在最底层的电子秤上。
电子秤的计量单位很小,所以显示的数字很大。

工作人员发现,其中读数最小的电子秤的示数为:2086458231

请你推算出:读数最大的电子秤的示数为多少?

注意:需要提交的是一个整数,不要填写任何多余的内容。

pyramid.txt

                             7 
                            5 8 
                           7 8 8 
                          9 2 7 2 
                         8 1 4 9 1 
                        8 1 8 8 4 1 
                       7 9 6 1 4 5 4 
                      5 6 5 5 6 9 5 6 
                     5 5 4 7 9 3 5 5 1 
                    7 5 7 9 7 4 7 3 3 1 
                   4 6 4 5 5 8 8 3 2 4 3 
                  1 1 3 3 1 6 6 5 5 4 4 2 
                 9 9 9 2 1 9 1 9 2 9 5 7 9 
                4 3 3 7 7 9 3 6 1 3 8 8 3 7 
               3 6 8 1 5 3 9 5 8 3 8 1 8 3 3 
              8 3 2 3 3 5 5 8 5 4 2 8 6 7 6 9 
             8 1 8 1 8 4 6 2 2 1 7 9 4 2 3 3 4 
            2 8 4 2 2 9 9 2 8 3 4 9 6 3 9 4 6 9 
           7 9 7 4 9 7 6 6 2 8 9 4 1 8 1 7 2 1 6 
          9 2 8 6 4 2 7 9 5 4 1 2 5 1 7 3 9 8 3 3 
         5 2 1 6 7 9 3 2 8 9 5 5 6 6 6 2 1 8 7 9 9 
        6 7 1 8 8 7 5 3 6 5 4 7 3 4 6 7 8 1 3 2 7 4 
       2 2 6 3 5 3 4 9 2 4 5 7 6 6 3 2 7 2 4 8 5 5 4 
      7 4 4 5 8 3 3 8 1 8 6 3 2 1 6 2 6 4 6 3 8 2 9 6 
     1 2 4 1 3 3 5 3 4 9 6 3 8 6 5 9 1 5 3 2 6 8 8 5 3 
    2 2 7 9 3 3 2 8 6 9 8 4 4 9 5 8 2 6 3 4 8 4 9 3 8 8 
   7 7 7 9 7 5 2 7 9 2 5 1 9 2 6 5 3 9 3 5 7 3 5 4 2 8 9 
  7 7 6 6 8 7 5 5 8 2 4 7 7 4 7 2 6 9 2 1 8 2 9 8 5 7 3 6 
 5 9 4 5 5 7 5 5 6 3 5 3 9 5 8 9 5 4 1 2 6 1 4 3 5 3 2 4 1 
X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X 
arr = []
k = 0
file = open('pyramid.txt', 'r')
for line in file.readlines():
    arr.append(list(map(int, line.split())))
arr.append([0]*30)
for i in range(1, 30):
    for j in range(i):
        arr[i][j] += arr[i - 1][j] / 2
        arr[i][j + 1] += arr[i - 1][j] / 2
print(2086458231 / min(arr[-1]) * max(arr[-1]))

3.10乘积尾零

题目描述

如下的10行数据,每行有10个整数,请你求出它们的乘积的末尾有多少个零?注意:需要提交的是一个整数,表示末尾零的个数。不要填写任何多余内容。

num.txt

5650 4542 3554 473 946 4114 3871 9073 90 4329
2758 7949 6113 5659 5245 7432 3051 4434 6704 3594
9937 1173 6866 3397 4759 7557 3070 2287 1453 9899
1486 5722 3135 1170 4014 5510 5120 729 2880 9019
2049 698 4582 4346 4427 646 9742 7340 1230 7683
5693 7015 6887 7381 4172 4341 2909 2027 7355 5649
6701 6645 1671 5978 2704 9926 295 3125 3878 6785
2066 4247 4800 1578 6652 4616 1113 6205 3264 2915
3966 5291 2904 1285 2193 1428 2265 8730 9436 7074
689 5510 8243 6114 337 4096 8199 7313 3685 211
with open('num.txt') as file:
    lines = file.readlines()
file.close
res = 0
for line in lines:
    for num in line.split():
        if res == 0:
            res = int(num)
        else:
            res *= int(num)
count = 0
for i in str(res)[::-1]:
    if i != '0':
        break
    count += 1
print(count)

元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章