🧠 判断题第 4 题
1、📌 题目原文
使用
math.h或cmath头文件中的函数,表达式sqrt(4)的结果类型为double。
✅ 判断结果:正确(√)
2、📖 故事讲解:
(1)🧙♂️ 数学魔法师 sqrt
在 C++ 王国里,有一位数学魔法师,名字叫:
sqrt他的任务是:
🔮开平方
(2)🧩 举个最简单的例子
sqrt(4)数学上我们知道答案是:
2但 C++ 会问一个问题:
❓“你这个 2,是整数?还是小数?”
3、🧠 关键知识点:
(1)📌sqrt的真实身份
sqrt是数学库函数,它的规则是:
👉不管你传进去的是整数还是小数
👉返回值一定是double(小数)
(2)🧪 小实验
auto x = sqrt(4);x的类型:double值是:
2.0
即使写成:
int a = sqrt(4);也是:
先得到
2.0再转换变成
2
4、🧠 记忆口诀
sqrt 爱小数,结果一定 double
🧠 判断题第 5 题
1、📌 题目原文
在杨辉三角形中,第 n 行(从 0 开始计数)的所有数字之和等于
2^n。
✅ 判断结果:正确(√)
2、📖 故事讲解:
(1)🔺 神奇的杨辉三角
杨辉三角长这样(从第 0 行开始):
第0行: 1 第1行: 1 1 第2行: 1 2 1 第3行: 1 3 3 1(2)🧮 我们来算一算“行的和”
| 行号 n | 这一行 | 加起来 |
|---|---|---|
| 0 | 1 | 1 = 2⁰ |
| 1 | 1 + 1 | 2 = 2¹ |
| 2 | 1 + 2 + 1 | 4 = 2² |
| 3 | 1 + 3 + 3 + 1 | 8 = 2³ |
🎉完全符合!
3、🧠 算法 & 数学原理(展开)
📌 为什么一定是 2ⁿ?
杨辉三角每一行,其实是:
(a + b)^n 的展开系数而:
(a + b)^n当我们令:
a = 1, b = 1就变成:
(1 + 1)^n = 2^n4、🧠 记忆口诀
杨辉第 n 行,加起来的和,是 2的n次方
🧠 判断题第 6 题
1、📌 题目原文
使用二叉堆优化的 Dijkstra 最短路算法,在某些特殊情况下,时间复杂度不如朴素实现的。
✅ 判断结果:正确(√)
2、📖 故事讲解:
(1)🐢 与 🚀 的比赛
我们有两位选手:
🐢朴素 Dijkstra
🚀堆优化 Dijkstra
(2)大家都以为:
🚀 一定比 🐢 快,对吧?
(3)⚠️不一定!
3、🧠 先说结论
📌工具更高级 ≠ 一定更快
4、🧩 两种 Dijkstra 的对比
(1)🐢 朴素版 Dijkstra
每次用
for循环找最小时间复杂度:
O(n²)代码简单
图很稠密(边很多)时:反而稳
(2)🚀 堆优化 Dijkstra
用优先队列(小根堆)
理论复杂度:
O((n + m) log n)适合边少的图
(3)⚠️ 为什么“有时更慢”?
在下面情况中:
点数很小
或边特别多
或频繁 push / pop 堆
👉 堆操作反而成了“拖油瓶”
5、🧠 给小学生的口诀
堆是好工具,
使用也要分情况
点数小,边特多
真的就是不适合
🧠 判断题第 7 题
📌 题目原文
n 个不同元素依次入栈的出栈序列数,与将 n 个不同元素划分成若干非空子集的方案数相等。
❌ 判断结果:错误(×)
一、📖 故事讲解:
🧩 第一件事:入栈出栈
有 n 个不同小朋友,按顺序进栈:
1 → 2 → 3 → ... → n问:
👉 有多少种合法出栈顺序?
答案是一个著名的数:
🎯卡特兰数(Catalan Number)
二、🏰 主角登场:卡特兰数(Catalan Number)
1、🎒 卡特兰数的故事:书包进出游戏
(1)🎮 游戏规则
有n 个不同的小朋友,
他们按顺序排队进一个书包(栈):
1 → 2 → 3 → ... → n规则只有两条:
1️⃣ 只能从包口进
2️⃣ 只能从包口出
(2)问:
👉有多少种“合法”的出包顺序?
2、🧠 为什么“不是随便出”?
因为这是一个栈(Stack):
后进去的
必须先出来
📌 这就像:
叠盘子 🍽️
最上面的盘子先拿
3、🧩 例子(n = 3)
小朋友是:1、2、3
❌ 不合法的出栈顺序
进:1 2 3 出:1 3 2 ❌原因:
3 在 2 上面
不能让 2 先出来
4、✅ 合法的出栈顺序
一共5 种:
1 2 3 1 3 2 2 1 3 2 3 1 3 2 1🎉这 5 就是卡特兰数 C₃
5、🧠 卡特兰数“管什么”?
只要你看到这些关键词:
栈进栈 / 出栈
括号是否匹配
左右孩子构成的二叉树
先做 / 后做的合法顺序
👉统统是卡特兰数在管
卡特兰数 = 合法情况的数量
6、🧠 最小的几个卡特兰数
| n | 卡特兰数 Cₙ |
|---|---|
| 0 | 1 |
| 1 | 1 |
| 2 | 2 |
| 3 | 5 |
| 4 | 14 |
| 5 | 42 |
🎉 这串数,就是卡特兰数列
三、🏗️ “搭积木”算卡特兰数(递推思想)
1、🧱 故事:搭一座“左右两部分的城堡”
用 n - 1 块积木 ,要搭一个左右两部分的城堡:
左边如果用 k 块(k从0开始)
右边就用 n−1−k 块
👉 左边有多少种?
👉 右边有多少种?
👉 一共有多少种?
2、🧠 思想来了
左边的可能数 × 右边的可能数
再把所有情况加起来
3、✨ 用一句话说计算方法
Cₙ = C₀×Cₙ₋₁ + C₁×Cₙ₋₂ + C₂×Cₙ₋₃ + ... + Cₙ₋₁×C₀📌 这叫:递推公式
4、🧸 参考程序:
#include <iostream> using namespace std; int main() { int N; cin >> N; // 用数组保存卡特兰数 // c[i] 表示第 i 个卡特兰数 long long c[35] = {0}; // 基础情况 c[0] = 1; c[1] = 1; // 递推计算卡特兰数 for (int n = 2; n <= N; n++) { for (int i = 0; i < n; i++) { c[n] += c[i] * c[n - 1 - i]; } } // 输出结果 cout << c[N] << endl; return 0; }四、📐 偷偷告诉你一个“数学快捷公式”
如果你能背的过,考试也可以用这个:
Cₙ = (1 / (n+1)) × 组合数(2n, n)比如:
C₃ = (1 / 4) × 20 = 5五、🏫 第二位主角:贝尔数(Bell Number)
1、🎈 贝尔数的故事:分组游戏
🎮 游戏规则
有n 个不同的小朋友,
老师要把他们:
分成若干组
每一组不能为空
不排顺序
问:
👉 一共有多少种不同的分法?
2、🧠 什么叫“不排顺序”?
下面两种:
{小红,小明} | {小刚} {小刚} | {小红,小明}👉是同一种分法!
🧩 例子(n = 3)
小朋友是:A、B、C
所有分组方法:
1️⃣{A B C}
2️⃣{A}{B C}
3️⃣{B}{A C}
4️⃣{C}{A B}
5️⃣{A}{B}{C}
🎉 一共5 种
👉 这就是贝尔数 B₃
🧠 贝尔数“管什么”?
看到这些关键词,就想到贝尔数:
分组
划分集合
不关心顺序
每组不能为空
3、🔺 计算神器登场:贝尔三角形(Bell Triangle)
这是小学生最友好的贝尔数计算方法🌟
不需要懂复杂公式!
🧱 1️⃣ 先搭一个三角形
规则只有 3 条:
规则①
第一行第一个数是 1
1规则②
每一行的第一个数 = 上一行的最后一个数
规则③
后面的数 = 左边的数 + 左上角的数
✨ 一步一步搭给你看
第 0 行
1👉 这是B₀ = 1
第 1 行
第一个数 = 上一行最后一个 = 1
1 2👉B₁ = 1
第 2 行
第一个数 = 上一行最后一个 = 2
2 3 5👉B₂ = 2
第 3 行
第一个数 = 上一行最后一个 = 5
5 7 10 15👉B₃ = 5
第 4 行
15 20 27 37 52👉B₄ = 15
4、🎉 发现规律了吗?
🌟每一行的第一个数,就是贝尔数!
5、📊 贝尔数前几项(记住这张表就赢一半)
| n | 贝尔数 Bₙ |
|---|---|
| 0 | 1 |
| 1 | 1 |
| 2 | 2 |
| 3 | 5 |
| 4 | 15 |
| 5 | 52 |
| 6 | 203 |
六🧠 为什么这个三角形是对的?
1、👨👩👧👦 每一行在干嘛?
一行代表:
👉“当前小朋友加入后”的所有可能变化左上角:
👉 老方案左边:
👉 新同学加入某一组的方式
2、不断累加,就把所有可能都算进来了 ✔️
七、✅ 参考程序:(贝尔三角形法)
#include <iostream> #include <vector> using namespace std; int main() { int n; cout << "请输入一个非负整数 n: "; cin >> n; if (n < 0) { cout << "n 必须是非负整数!" << endl; return 0; } // 创建一个二维数组保存贝尔三角形 vector<vector<long long>> bell(n + 1, vector<long long>(n + 1, 0)); // 初始化 bell[0][0] = 1; // B0 = 1 // 构建贝尔三角形 for (int i = 1; i <= n; i++) { // 每行第一个数是上一行最后一个数 bell[i][0] = bell[i-1][i-1]; // 后面的每个数是左上角 + 左边 for (int j = 1; j <= i; j++) { bell[i][j] = bell[i-1][j-1] + bell[i][j-1]; } } cout << n << " 的贝尔数是: " << bell[n][0] << endl; return 0; }八、🧠 本题回顾(算法)
| 问题 | 对应数学 |
|---|---|
| 入栈出栈序列 | 卡特兰数 |
| 划分子集 | 贝尔数 |
👉完全不是一类数!
十、🧠 记忆口诀
栈用卡特兰,分组用贝尔数