2021年软件类第十二届蓝桥杯第二场省赛 python组 A-E题解

简介: 2021年软件类第十二届蓝桥杯第二场省赛 python组 A-E题解

试题 A:求余


85fba28aa7db4f0199f72eade104c295.png

思路


这道题,emmmm,没思路,直接算,可能测试一下吧


代码


print(2021%20)


答案


1


试题 B:双阶乘



5425b933be3e432aa7665eaba1db23f5.png


思路


这道题也很简单,我们求最后五位,就是%100000,然后双阶乘,实际上就是每隔1个相乘,所以我们直接循环计算即可


代码

dp = [1]*2022
for i in range(3,2022,2):
    dp[i] = dp[i-2]*i
print(dp[2021]%100000) # 答案59375

答案


59375


题目 C:格点



b28af0a226ca4f44aca799e11aad181e.png

思路


这道题我们的思路是很清晰的,首先我们的坐标一定是整数,这样我们的数就是格点,其次我们在第一象限获取符合条件的数在我们的条件中,题目说,要坐标x和坐标y相乘小于等于2021,我们就可以遍历这之间的数,如果我们的数的坐标相乘小于等于2021,那我们的计数就+1,最后打印出我们最后的值即可


代码


ans = 0
for x in range(1,2021+1): # 保证起码是1~2021的数据
    for y in range(1,2021//x + 1): # 范围是1 ~ 2021//x
        if x*y <= 2021: # 如果x*y<=2021
            ans += 1
print(ans) # 答案:15698


答案


15698


试题 D:整数分解



585131c4c2694300b76562d383c8d378.png

思路


首先最简单的思路就是5重循环不过O(n^5)的复杂度,让人望而却步,我也尝试进行一个改进一下范围,但是结果还是不近如意,除非在考试的时候,顶多运行5个小时一定出的来,或者利用C++运行应该会快很多的


好咯,废话不多说,这里讲一下正解,其实呢,这道题可以用隔板的思想


比如说3分为两个数,实际上就是3个小球,一个隔板,有几种放法,3 = 1 + 2,@|@@或者是3 = 2 + 1,@@|@,所以这就是一个组合的问题了,我们可以看到,3个小球有2个空隙(最前面和最后面不算),放一个隔板,就是image.png


所以这样来看,我们的2021分为五个数,就是2021个球放4个隔板,有几种放法,根据上面来看,一共2020个空隙,4个隔板,一共就是image.png


代码

# cnt = 0
# for a in range(1,2022):
#     for b in range(1,2022-a-3):
#         for c in range(1,2022-a-b-2):
#             for d in range(1,2022-a-b-c-1):
#                 for e in range(1,2022-a-b-c-d):
#                     if a + b + c + d + e == 2021:
#                         cnt += 1
# print(cnt)
import math # 利用math库的组合数
print(math.comb(2020,4)) # 答案:694422703815
print(2020*2019*2018*2017*2016//5//4//3//2//1)

答案


694422703815


试题 E:城邦



394bf2660a4d43e19a759da9f9b71e93.png

思路


这道题实际上也很简单,其实就是一道最小生成数的模板题,那我们可以直接套最小生成树的模板


理清思路了以后,我们可以理清楚一下这道题的思路,首先,我们有2021个城邦,我们要使所有城邦可以互通,最大image.png 种方案,相当于每两个城邦建一座桥,不过这种耗费是很大的,并且,我们的题目说了,我们会建立2020座桥,并且要求花费是最小的,所以这就是在考最小生成树的知识点


生成树定义:对于有n个顶点的连通图,只有n-1条边的连通子图就是它的生成树。(既然是树就不可能存在环)

所以简言之,生成树就是以最少的边(n-1)条边来连接所有顶点的图。但是:


fffaa29dca6a4078b058627078277ccc.png


生成树不唯一(取的边的组合不唯一),当我们赋予了边的权值时,所有边的权值的和也就必然有一个最小值。即最小生成树


知道定义了以后,我们这里用的是克鲁斯卡算法,kruskal的基本算法思想,创建边的数组(i,j,weihgt),按照边的权值排序(贪心),然后,初始化各个顶点作为一个独立的集合(并查集思想),遍历边(贪心),如果i和j不在同一集合,意味着i,j不连通(并查集),对应的边应当取过来,权值和累加一次,否则如果i和j在同一集合(已经连通),意味着这条边不应取过来…直至取完n-1条边,只剩下一个集合,这个集合包含所有点(连通性)那么最终的权值和一定是最小的(最小权值和)。


代码

# 初始化祖先
father = [i for i in range(2022)]
def get_father(x):
    # 压缩路径,查找集合
    if x != father[x]:
        father[x] = get_father(father[x])
    return father[x]
# 合并两节点        
def union(x,y):
    xfather,yfather = get_father(x),get_father(y)
    if xfather != yfather:
        father[xfather] = yfather
# 计算权重
def get_weight(x,y):
    s = 0
    while x or y:
        if x%10 != y%10:
            s += x%10 + y%10
        x //= 10
        y //= 10
    return s
#创建边集(i,j,weight)
edge=[]
for i in range(1,2022):
    for j in range(1,2022):
        edge.append((i,j,get_weight(i,j)))
edge.sort(key=lambda x:x[2]) # 根据权重排序
cnt = 0
ans = 0
for i in edge:
    # 不在同一个连通分量中,并且没有建立2020座桥
    if get_father(i[0]) != get_father(i[1]) and cnt < 2020:
        union(i[0],i[1])
        cnt += 1
        ans += i[2]
print(ans) # 答案:4046

答案


4046

相关文章
|
4天前
|
Python
Python-类视图和蓝图
Python-类视图和蓝图
11 2
|
4天前
|
存储 Java 数据安全/隐私保护
Python----类对象和实例对象
Python----类对象和实例对象
9 2
|
4天前
|
JSON 监控 调度
局域网管理软件的自动化任务调度:Python 中的 APScheduler 库的应用
使用 Python 的 APScheduler 库可简化局域网管理中的自动化任务调度。APScheduler 是一个轻量级定时任务调度库,支持多种触发方式如间隔、时间、日期和 Cron 表达式。示例代码展示了如何创建每 10 秒执行一次的定时任务。在局域网管理场景中,可以利用 APScheduler 定期监控设备状态,当设备离线时自动提交数据到网站,提升管理效率。
30 0
|
4天前
|
存储 C++ Python
LabVIEW使用Python MathWorks® MATLAB®软件和C/C++
LabVIEW使用Python MathWorks® MATLAB®软件和C/C++
|
4天前
|
C++ Python
Python中的类与对象
Python中的类与对象
8 1
|
4天前
|
Python
在Python中,类的属性可以分为公有属性和私有属性
【5月更文挑战第7天】Python类包含公有和私有属性。公有属性可直接外部访问,如`person.name`,而私有属性如`_name`需通过getter/setter方法访问,如`person.getName()`和`person.setName()`。私有属性用于封装数据、隐藏实现细节,增强代码可维护性和安全性。封装能灵活修改内部实现,不影响外部;安全性防止外部非法修改数据;一致性确保所有数据操作在类内完成,简化代码并减少错误。
28 10
|
4天前
|
Python
【Python 基础】Python中的实例方法、静态方法和类方法有什么区别?
【5月更文挑战第6天】【Python 基础】Python中的实例方法、静态方法和类方法有什么区别?
|
4天前
|
存储 程序员 Python
Python中自定义类实例化数组的艺术
Python中自定义类实例化数组的艺术
11 1
|
4天前
|
程序员 Linux C++
Python中的WinForms类桌面应用程序开发
Python中的WinForms类桌面应用程序开发
25 4
|
4天前
|
Java 开发者 索引
Python基础语法:类笔记
本篇博文是把自己在学习python类的过程中自己理解和笔记,一点一点总结的写出出来,做一个总结,加深对面向对象编程的理解。