2021软件类第十二届蓝桥杯国赛真题 Python组 A-E题解

简介: 2021软件类第十二届蓝桥杯国赛真题 Python组 A-E题解

备战第十三届蓝桥杯国赛


试题 A: 带宽


本题总分:5分


问题描述】


小蓝家的网络带宽是 200Mbps,请问,使用小蓝家的网络理论上每秒钟最多可以从网上下载多少 MB 的内容。


【思路分析】


这个题就比较简单了,签到题,Mbps/8就是实际速度


参考答案


25


试题 B: 纯质数


本题总分:5 分


【问题描述】


如果一个正整数只有 1 11 和它本身两个约数,则称为一个质数(又称素数)。


前几个质数是:2 , 3 , 5 , 7 , 11 , 13 , 17 , 19 , 23 , 29 , 31 , 37 , . . .


如果一个质数的所有十进制数位都是质数,我们称它为纯质数。例如:2 , 3 , 5 , 7 , 23 , 37都是纯质数,而 11 , 13 , 17 , 19 , 29 , 31 11, 13, 17, 19, 29, 31 不是纯质数。当然 1 , 4 , 35 也不是纯质数。


请问,在1 到 20210605 中,有多少个纯质数?


【思路分析】


这道题还是比较简单,最直接的想法就是循环判断,这里的1~20210605中的质数我们可以利用埃氏筛来得到


接着循环判断每一位就很快出结果了。


除此之外,我还看到一个挺好的思路,我们已经知道了0,4,6,8,9这些肯定不是质数,所以位数含这些一定不是纯质数,所以我们只会对无这些数的数进行判断是否是质数,这样可能也会更加快,不过基本思路相同。


代码code

# 埃氏筛得到1-n的质数
def get_prime(n):
    prime = [1]*(n+1)
    prime[0] = 0
    prime[1] = 0
    for i in range(2,int(n**0.5)+1):
        if prime[i] == 1:
            for j in range(2*i,n+1,i):
                prime[j] = 0
    return prime
cnt = 0
n = 20210605
prime = get_prime(n)
for i in range(1,n+1):
    if prime[i]:
        flag = True
        for j in str(i):
            j = int(j)
            if prime[j] == 0:
                flag = False
                break
        if flag:
            cnt += 1
print(cnt)

参考答案


1903


试题 C: 完全日期


本题总分:10 分


【问题描述】


如果一个日期中年月日的各位数字之和是完全平方数,则称为一个完全日期。


例如:2021年6 月5 日的各位数字之和为2 + 0 + 2 + 1 + 6 + 5 = 16,而 16 是一个完全平方数,它是 4 的平方。所以2021 年 6 月 5 日是一个完全日期。


例如:2021年6 月23 日的各位数字之和为2 + 0 + 2 + 1 + 6 + 2 + 3 = 16 ,是一个完全平方数。所以2021 年6 月23 日也是一个完全日期。


请问,从2001 年1 月1 日到2021 年12 月31 日中,一共有多少个完全日期?


【思路分析】


常规日期题,模拟日期操作然后判断即可。日期,最大 8 位数,最大的和应为2 + 0 + 1 + 9 + 1 + 2 + 2 + 9 = 26,所以可以提前算出来[1,4,9,16,25]这几个数,然后直接判断即可,不必重复计算。


【代码code】


def wonderDate(year, month, day):
    date = [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
    year = list(map(int, list(str(year))))
    month = list(map(int, list(str(month))))
    day = list(map(int, list(str(day))))
    return sum(year) + sum(month) + sum(day) in date
year, month, day, c = 2001, 1, 1, 0
while year < 2022:
    if wonderDate(year, month, day):
        c += 1
    day += 1
    if year in [2004, 2008, 2012, 2016, 2020] and month == 2 and day > 29:
        day = 1
        month += 1
    elif month == 2 and day > 28:
        day = 1
        month += 1
    elif month in [1, 3, 5, 7, 8, 10, 12] and day > 31:
        day = 1
        month += 1
    elif month in [4, 6, 9, 11] and day > 30:
        day = 1
        month += 1
    if month > 12:
        month = 1
        year += 1
print(c)


也可以合理的利用python的datetime库进行一个简单的求解,说白了,本题只要你掌握了合适的API函数,基本就没啥坑点。

import datetime
import math
start = datetime.datetime(year=2001, month=1, day=1)
end = datetime.datetime(year=2021, month=12, day=31)
res = 0
for i in range(1, (end - start).days + 1):
    cur = start + datetime.timedelta(days=i)
    s = str(cur.year) + str(cur.month) + str(cur.day)
    n = sum(list(map(int, s)))
    if pow(int(math.sqrt(n)), 2) == n:
        res += 1
print(res)

【参考答案】


977


试题 D: 最小权值


本题总分:10 分


【问题描述】


对于一棵有根二叉树 T ,小蓝定义这棵树中结点的权值 W ( T ) 如下:


空子树的权值为 0 。


如果一个结点 v 有左子树 L 右子树 R,分别有 C ( L ) 和 C ( R ) 个结点,则


image.png


树的权值定义为树的根结点的权值。

小蓝想知道,对于一棵有 2021个结点的二叉树,树的权值最小可能是多 少?


【思路分析】


这道题实际上是一道典型的动态规划dp的题目,dp[i]代表有i个节点的树的最小权值。


对于有i个节点的树而言,这棵树的权值取决于根节点的左右子树的分布,我们能够枚举的只是左右子树的节点个数分布,无法直接枚举左右子树形态分布,再看一下题目中所给的权值计算方法可以得到一个结论,树的权值是随着左右子树的权值变小而变小的,也就是说在其他条件不变的情况下(这里的其他条件指的是另一棵子树的形态不变以及节点个数不变),改变某一棵子树的形态使其权值变小则会使整棵树的权值变小,由于左右子树的形态是相互独立的,也就是说在左右子树节点个数一定的情况下我们只需要使得左右子树的权值分别达到最小即可,而这正是我们状态表示中所涵盖的信息,因此就有了状态转移的方程:


image.png


j是当前根节点左子树的节点个数,而i是当前子树中所有节点的个数,所以右子树的节点个数就是i-j-1(1是根节点),f[j]和f[i-j-1]分别表示在左右子树节点个数一定的情况下的最小权值


由于求的是最小值,所以一开始不要忘记把所有的f数组初始化为正无穷大,把dp[0]初始化为0.


代码code

dp = [float('inf')]*2022
dp[0] = 0
for i in range(1,2022):
    for j in range(i): # 枚举左子树的节点数
        dp[i] = min(dp[i],1+2*dp[j]+3*dp[i-j-1]+j*j*(i-j-1)) # 动态转移方程
print(dp[2021]) # 2653631372

【参考答案】


2653631372


试题 E: 大写


时间限制: 1.0s 内存限制: 256.0MB 本题总分:15 分


【问题描述】


给定一个只包含大写字母和小写字母的字符串,请将其中所有的小写字母 转换成大写字母后将字符串输出。


【输入格式】


输入一行包含一个字符串。


【输出格式】


输出转换成大写后的字符串。


【样例输入 1】


LanQiao


【样例输出 1】


LANQIAO


【思路分析】


这道题没什么好说的,签到题


代码code


print(input().upper())


相关文章
|
3月前
|
Python
蓝桥杯练习题(一):Python组之入门训练题
这篇文章是关于蓝桥杯Python组的入门训练题,包括Fibonacci数列、圆的面积、序列求和和A+B问题的具体代码实现和样例输出。
157 0
|
16天前
|
存储 运维 监控
探索局域网电脑监控软件:Python算法与数据结构的巧妙结合
在数字化时代,局域网电脑监控软件成为企业管理和IT运维的重要工具,确保数据安全和网络稳定。本文探讨其背后的关键技术——Python中的算法与数据结构,如字典用于高效存储设备信息,以及数据收集、异常检测和聚合算法提升监控效率。通过Python代码示例,展示了如何实现基本监控功能,帮助读者理解其工作原理并激发技术兴趣。
50 20
|
13天前
|
存储 缓存 算法
探索企业文件管理软件:Python中的哈希表算法应用
企业文件管理软件依赖哈希表实现高效的数据管理和安全保障。哈希表通过键值映射,提供平均O(1)时间复杂度的快速访问,适用于海量文件处理。在Python中,字典类型基于哈希表实现,可用于管理文件元数据、缓存机制、版本控制及快速搜索等功能,极大提升工作效率和数据安全性。
51 0
|
3月前
|
存储 机器学习/深度学习 算法
蓝桥杯练习题(三):Python组之算法训练提高综合五十题
蓝桥杯Python编程练习题的集合,涵盖了从基础到提高的多个算法题目及其解答。
135 3
蓝桥杯练习题(三):Python组之算法训练提高综合五十题
|
3月前
|
索引 Python
python-类属性操作
【10月更文挑战第11天】 python类属性操作列举
33 1
|
3月前
|
Java C++ Python
Python基础---类
【10月更文挑战第10天】Python类的定义
31 2
|
3月前
|
人工智能 Python
蓝桥杯练习题(四):Python组之历届试题三十题
关于蓝桥杯Python组历届试题的三十个练习题的总结,包括题目描述、输入输出格式、样例输入输出以及部分题目的解题思路和代码实现。
56 0
蓝桥杯练习题(四):Python组之历届试题三十题
WK
|
3月前
|
Python
Python类命名
在Python编程中,类命名至关重要,影响代码的可读性和维护性。建议使用大写驼峰命名法(如Employee),确保名称简洁且具描述性,避免使用内置类型名及单字母或数字开头,遵循PEP 8风格指南,保持项目内命名风格一致。
WK
24 0
|
3月前
|
存储 机器学习/深度学习 算法
蓝桥杯练习题(二):Python组之基础练习三十题
蓝桥杯Python编程练习题的集合,包含了三十个不同难度的编程题目,覆盖了基础语法、数据结构和算法等领域。
60 0
|
1月前
|
人工智能 数据可视化 数据挖掘
探索Python编程:从基础到高级
在这篇文章中,我们将一起深入探索Python编程的世界。无论你是初学者还是有经验的程序员,都可以从中获得新的知识和技能。我们将从Python的基础语法开始,然后逐步过渡到更复杂的主题,如面向对象编程、异常处理和模块使用。最后,我们将通过一些实际的代码示例,来展示如何应用这些知识解决实际问题。让我们一起开启Python编程的旅程吧!