黔南布依族苗族自治州网站建设_网站建设公司_博客网站_seo优化
2026/1/8 18:40:46 网站建设 项目流程


🧠 判断题第 4 题

1、📌 题目原文

使用math.hcmath头文件中的函数,表达式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这一行加起来
011 = 2⁰
11 + 12 = 2¹
21 + 2 + 14 = 2²
31 + 3 + 3 + 18 = 2³

🎉完全符合!


3、🧠 算法 & 数学原理(展开)

📌 为什么一定是 2ⁿ?

杨辉三角每一行,其实是:

(a + b)^n 的展开系数

而:

(a + b)^n

当我们令:

a = 1, b = 1

就变成:

(1 + 1)^n = 2^n

4、🧠 记忆口诀

杨辉第 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ₙ
01
11
22
35
414
542

🎉 这串数,就是卡特兰数列


三、🏗️ “搭积木”算卡特兰数(递推思想)

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ₙ
01
11
22
35
415
552
6203

六🧠 为什么这个三角形是对的?

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; }

八、🧠 本题回顾(算法)

问题对应数学
入栈出栈序列卡特兰数
划分子集贝尔数

👉完全不是一类数!


十、🧠 记忆口诀

栈用卡特兰,分组用贝尔数


需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询