python蓝桥杯真题打卡 | day9

本文解析了最小权值二叉树的构建思路和代码实现,介绍了冒泡排序的最坏案例,以及美丽2问题、阶乘约数计数和本质上升序列的解法。涉及关键词包括动态规划、排序算法、质因数分解和递归。

1.最小权值

题目

在这里插入图片描述

解析

一开始,从2021个结点,已经构建好的二叉树的角度去思考,毫无头绪。
本题要站在构建二叉树过程的角度去思考
首先一个结点都没有,空树,权值为0 ==
只有一个结点时,此时的
权值为1==

dp = [0,1]

两个结点时,循环设左子树的个数为0或1,不同状态下的改结点的权值,并多种状态下不同值的最小值
三个结点时,循环设左子树的个数为0或1或2,不同状态下的改结点的权值,并多种状态下不同值的最小值
以此类推
其中,左子树的个数设为i那么右子树的个数就是i-j-1

初始时,空树是权值0,第一个结点的权值为1,其他2020个结点权值为inf 无穷大

dp=[0]+ [1] +[float("inf")]*2020

在这里插入图片描述

代码

dp=[0]+ [1] +[float("inf")]*2020 
for i in range(1,2022):     #遍历结点1~2021
    for j in range(i):      #遍历结点0~i
        dp[i]=min(dp[i],1+2*dp[j]+3*dp[i-j-1]+j*j*(i-j-1))#递推公式

print(dp)
print(dp[2021])             #输出结果:2653631372

2. 排序

题目

在这里插入图片描述

解析

由题意qiao的排序交换次数为4 ==> 顺序排序

冒泡排序的最坏情况是初始全部逆序,这样交换次数为
在这里插入图片描述
例: 5 4 3 2 1
交换次数为 4 + 3 + 2 + 1,符合公式

找到符合100次的最坏情况为多少个字母
15个字母时,最坏为105次
满足字典序最小,也就是abcdefghijklmno
注:若是字典序最大,也就是从z前往前数15个
倒着写就是onmlkjihggedcba
105比100多了5次,我们反推,正常是,开头字符向后比较,我们这里反向思考,找到交换次数为5的j,把它放到最前面,也就是jonmlkihgfedcba在这里插入图片描述

代码

#代码验证:判断交换次数是否为100次?
s=list("jonmlkihgfedcba")
cnt=0
#冒泡排序
for i in range(len(s)-1):
    for j in range(len(s)-1-i):
        if s[j]>s[j+1]:
            s[j],s[j+1]=s[j+1],s[j]
            cnt+=1
print(cnt)

3. 美丽的2 (送分题)

题目

在这里插入图片描述

代码

count = 0
for i in range(1,2021):
    if '2' in str(i):
        count+= 1

print(count)

4.阶乘约数

题目

在这里插入图片描述

解析

在这里插入图片描述

代码

#1.创建1~100的质数集
def prime(x):
    for i in range(2,int(x**0.5)+1):
        if x%i==0:
            return False
    return True
zhishu=[i for i in range(2,101) if prime(i)==True]
#zhishu=[2,3,5,7,11···,97]
        
#2.计算约数个数
a=[0]*100                #创建计数数组
for i in range(1,101):   #遍历1~100
    x=i                  #当前变量赋值
    for j in zhishu:     #遍历质数数组
        while x%j==0:    #判断约数
            a[j]+=1      #对应计数+1
            x//=j        #循环条件
#a=[0, 0, 97···0,0]
a=[i for i in a if a!=0]
#[97, 48, 24, 16···]
 
#3.遍历结果
ans=1
for i in a:
    ans*=i+1             #唯一分解定理公式
print(ans)               #39001250856960000

5. 本质上升序列

题目

在这里插入图片描述

解析

以abc为例子
在这里插入图片描述

代码

s ='tocyjkdzcieoiodfpbgcncsrjbhmugdnojjddhllnofawllbhfiadgdcdjstemphmnjihecoapdjjrprrqnhgccevdarufmliqijgihhfgdcmxvicfauachlifhafpdccfseflcdgjncadfclvfmadvrnaaahahndsikzssoywakgnfjjaihtniptwoulxbaeqkqhfwl'

dp = [1 for i in range(len(s))]
for i in range(len(s)):
    for j in range(i):
        if s[i] > s[j]:
            dp[i] += dp[j]
        if s[i] == s[j]:
            dp[i] -= dp[j]

print(sum(dp))

在这里插入图片描述

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lijiamingccc

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值