本讲定位:完善程序 2 段 × 5 空 × 3 分 = 30 分,是全卷第二大板块,也是最模式化的板块:七年真题(见
cspj-exam-analysis-2019-2025.md)的固定配方是”一段数学/枚举判定 + 一段经典有名算法”,且经典算法段近年向”有名有姓的模板”收敛——押模板的收益在上升。本讲给出一套五步答题法(核心是”任务一句话”和”选项差分”),把常见的空归成四大空型逐型专练,最后按模板清单组织”挖五空互考”训练。完善程序与阅读程序是一体两面:阅读是”给代码问行为”,完善是”给任务补代码”。第 09 讲的三武器(模拟、不变量、复杂度)在本讲全部反向复用——填完的空要用阅读的方法验收。
前置知识:第 09 讲(验收方法)、第 12 讲(递归空型)、第 08 讲(二分模板)、第 11 讲(数论程序)、第 01 讲(STL)。
课时:建议 2 次课。上半:五步法 + 四大空型(第 1~3 节);下半:两段实战 + 模板互考(第 4~6 节)。
适合对象:CSP-J 初赛。标注 ⭐ 的小节为进阶内容,第一遍学习可以跳过。
每年 2 段程序,各挖 5 个空,每空是 4 选 1 的单选、3 分,合计 30 分。不需要你从零写代码——只需要在四个高度相似的选项里挑对的那个,这决定了核心技术是”对比选项的差异”而不是”凭空构造代码”。
| 年 | 段 1(数学/枚举判定) | 段 2(经典有名算法) |
|---|---|---|
| 2019 | 分形矩阵递归生成 | 双关键字计数排序 |
| 2020 | 试除法质因数分解 | 冒泡 + 贪心区间覆盖 |
| 2021 | 约瑟夫数组模拟 | 矩形计数(枚举+排序+二分) |
| 2022 | 枚举因数到 $\sqrt n$ | BFS flood fill |
| 2023 | 二分找缺失数 | 编辑距离 DP |
| 2024 | 完全平方数判定 | 汉诺塔递归 |
| 2025 | RLE 字符串解码 | 摩尔投票 |
2026 预测(真题分析 5.4 节):段 1 候选是进制转换实现、质因数分解变形、日期/模拟;段 2 从未考过的待押模板里出,头号候选是栈模拟表达式求值(选择题里前/中/后缀表达式四年三考、铺垫极多,完善程序却七年未出)。本讲两段实战按这两个预测配置。
空不是孤立的填空题,是一段完整程序里缺的零件。 先弄清整段程序的任务和每个变量的角色,每个空”该干什么”就基本确定了;四个选项再用差异点逐一淘汰。先看空、后读题是本末倒置,也是失分的第一原因。
用一句话向自己复述:“这段程序读入什么、算什么、输出什么。”圈出数据范围(判断类型和复杂度用)。
把空当成”此处省略”,通读一遍,给每个变量标注角色:
cnt—— 计数器;i—— 扫描下标;st—— 存操作数的栈;f[i][j]—— DP 状态(含义一句话)……
变量的角色一旦明确,空的任务就浮出来了。DP 段尤其要先写出 f 的准确含义(第 09 讲实战二的教训:差之毫厘的状态含义是头号陷阱)。