模拟算法
基础概念
基通俗讲解
“模拟”就是题目让你怎么做,你就怎么写,不追求巧妙,只求准确。绝大多数阅读程序题本质都是模拟,关键是忠实变量追踪。
核心必背考点
背直接默写拿分
- 步骤:理清“状态变量”→ 按题意逐行翻译 → 输出。
- 常用:计数器、标志位、临时变量。
- 阅读程序时把每个变量在每轮的值列成表,最稳。
高频难点 / 拉分考点
难考场极易丢分
模拟题“坑”在边界与顺序:先改后比、先输出后更新、正好 n 次还是 n+1 次。阅读程序务必逐轮演算,别跳步。
出题陷阱
坑文字套路
- “直到满足某条件停止”易多算/少算一轮。
- 数组下标与题意编号(从1)不一致时错位。
90分高分技巧
技速算捷径
用“输入输出预判 → 变量追踪表 → 循环边界标记”四步法(详见模块⑤阅读程序法),模拟题基本不丢分。
梯度真题
基础阅读程序累加求和模拟
逐轮加 i。
| 1 | int s=0; |
| 2 | for(int i=1;i<=5;i++) s+=i; |
| 3 | cout<<s; |
▍解析:答案 15。
中档阅读程序找最大值
维护 maxv,遇更大则更新。
| 1 | int a[5]={3,7,2,9,5}, mx=a[0]; |
| 2 | for(int i=1;i<5;i++) |
| 3 | if(a[i]>mx) mx=a[i]; |
| 4 | cout<<mx; |
▍解析:答案 9。
压轴阅读程序约瑟夫简化(每步删一个)
用标志位模拟淘汰。
| 1 | int n=5; vector<bool> v(n,true); |
| 2 | int left=n, cur=0; |
| 3 | while(left>1){ |
| 4 | if(v[cur]){ v[cur]=false; left--; } |
| 5 | cur=(cur+1)%n; |
| 6 | } |
| 7 | for(int i=0;i<n;i++) if(v[i]) cout<<i; |
▍解析:答案 幸存者下标(按规则得出)。
记忆口诀
技📌 记忆口诀
“题目怎么讲就怎么写,变量逐轮列成表;边界顺序莫跳步,模拟忠实分不掉。”
📝 本节自测共 6 题
做完点「提交本节自测」即时判分;单选 / 多选 / 填空混合,答错可一键收入错题本。
“模拟算法”的核心思想是?
✅ 正确答案:A
模拟就是“题目怎么讲就怎么写”,忠实实现。
阅读模拟类程序时,最稳妥的做法是?
✅ 正确答案:A
把每个变量每轮的值列成表,最不易出错。
模拟题最常见的失分点是?
✅ 正确答案:A
“先改后比 / 正好 n 次还是 n+1 次”等边界顺序坑。
含 n 个节点的完全二叉树,高度约为 ____(大 O)。(填空) 填空题 中
✅ 正确答案:log n
完全二叉树高度约 O(log n)。
两层嵌套循环(各 n 次)时间复杂度 O(n²),当 n=100 时约执行 ____ 次。(填空) 填空题 中
✅ 正确答案:10000
100×100 = 10000。
下列哪些算法基于“分治”思想?(多选) 多选题 中
✅ 正确答案:ABC
归并 / 快排 / 二分均体现分而治之;冒泡是蛮力。