2020年蓝桥杯校内模拟赛复盘

本文是作者对2020年蓝桥杯校内模拟赛的复盘,详细分析了填空题和编程题的解题思路与代码实现,涉及算法和数据结构的应用。
摘要由CSDN通过智能技术生成

2020年蓝桥杯校内模拟赛复盘

全校大约40人参加本次模拟赛,成绩只排13。对于失分点在何处甚是不解,发现思路或是细节有不妥的同学欢迎前来斧正,共同进步: )

填空题

本人报的是 C/C++ 类型的比赛,在填空题时为了快速得出结果采用的是 Python

1. 1200000 有多少个约数?(只计算正约数)

思路

本题从 [ 1 , 1200000 ] [1, 1200000] [1,1200000] 遍历即可,结果为 96

代码
  • Python

    • 法1(常规做法)
    res = 0
    for i in range(1, 1200001):
        if 1200000 % i == 0:
            res += 1
    print(res)
    
    • 法2(列表生成式)
    print(sum([1200000 % i == 0 for i in range(1, 1200001)]))
    
  • C++

    #include <iostream>
    using namespace std;
    int main()
    {
        int res = 0;
        for (int i = 1; i <= 1200000; i++)
        {
            if (1200000 % i == 0)
            {
                res++;
            }
        }
        cout << res << endl;
        return 0;
    }
    

2. 在计算机存储中,15.125GB是多少MB

思路

根据进制换算 1 G B = 2 10 M B = 1024 M B 1GB = 2 ^ {10} MB = 1024MB 1GB=210MB=1024MB,进行简单乘法 15.125 ∗ 1024 = 15488 15.125 * 1024 = 15488 15.1251024=15488

代码
#include <iostream>
using namespace std;
int main()
{
    cout << (15.125 * 1024) << endl;
    return 0;
}

3. 一棵包含有 2019 个结点的树,最多包含多少个叶结点

思路

在总结点数一定时,完全二叉树中有最多的叶子结点。
我在做题时忘了具体的计算公式,是在纸上画图算的,思路是算出每一层的二叉树结点数:

第几层 结点数
1 1
2 2
3 4
4 8
10 512

可看出当层数为 n n n 时每一层的结点数为 2 n − 1 2 ^ {n -1} 2n1,那么前 n n n 层的结点总数为 1 + 2 + 3 + . . . + 2 n − 1 = 2 n − 1 1 + 2 + 3 + ... + 2 ^ {n - 1} = 2 ^ n - 1 1+2+3+...+2n1=2n1,采取快速逼近的思想,要使结点总数最接近 2019,当 n = 10 n = 10 n=10 时结点总数为 1023,与 2019 相差 996,故最后一层有 996 个结点,占用了倒数第2层 498 个结点的子结点位置,使得倒数第2层减少了 498 个叶子结点(倒数第2层总共有 512 个结点)而剩下 14 个叶子结点。所以叶子结点总共有 最后一层 996 + 倒数第2层 14 = 1010 个结点。


后来看到有大佬的博客提到由结点总数推出叶子结点数的公式。

太长不看版
叶子结点最多的个数与结点总数的奇偶有关,奇数个则有 n + 1 2 \frac{n + 1}{2} 2n+1个,偶数个则有 n 2 \frac{n}{2} 2n 个。

具体分析:

叶子结点就是出度为 0 的结点,即没有子结点的结点。

  1. 假设 n n n 为完全二叉树的结点总数, n 0 n_0 n0 是度为0的结点总数(即叶子结点数), n 1 n_1 n1 是度为1的结点总数, n 2 n_2 n2 是度为2的结点总数,边数为b。

  2. 二叉树的性质可知: n = n 0 + n 1 + n 2 (1) n = n_0 + n_1 + n_2\tag{1}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值