文章目录
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.125∗1024=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} 2n−1,那么前 n n n 层的结点总数为 1 + 2 + 3 + . . . + 2 n − 1 = 2 n − 1 1 + 2 + 3 + ... + 2 ^ {n - 1} = 2 ^ n - 1 1+2+3+...+2n−1=2n−1,采取快速逼近的思想,要使结点总数最接近 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
的结点,即没有子结点的结点。
-
假设 n n n 为完全二叉树的结点总数, n 0 n_0 n0 是度为0的结点总数(即叶子结点数), n 1 n_1 n1 是度为1的结点总数, n 2 n_2 n2 是度为2的结点总数,边数为b。
-
由二叉树的性质可知: n = n 0 + n 1 + n 2 (1) n = n_0 + n_1 + n_2\tag{1}