乐于分享
好东西不私藏

2025年CSP-J第一轮笔试试题解析(三)—— 完善程序题精讲

2025年CSP-J第一轮笔试试题解析(三)—— 完善程序题精讲

2025年CSP-J第一轮笔试试题分析讲解(三)——完善程序题深度解析

完善程序题是CSP-J第一轮的压轴题型,满分30分(每小题3分)。本题型给出一段不完整的代码,要求从选项中选出正确的语句填入空白处。本文对2025年真题的2道完善程序题进行深度解析。


一、完善程序题整体分析

题量与分值:共2道大题,每道含5个空白,每空3分,满分30分 考查形式:给出完整注释的不完整代码 → 理解算法意图 → 选择正确语句填空 解题核心理解算法思想,结合上下文推断空白处含义

时间分配建议:2道题约25~30分钟


二、第一道完善程序题:字符串解码

题目背景

问题描述:给定一个经过编码的字符串,要求将其解码为原始字符串。

编码规则(示例)

原字符串:  "aaaabbbcc"
编码后:    "a4b3c2"

即:字符 + 重复次数,如果字符只出现1次,则省略数字1。

核心算法思路

// 算法:遍历编码字符串,识别"字符"和"数字"
// 遇到字符:记录当前字符ch
// 遇到数字:累计数字值count(可能有多位)
// 输出:将ch重复count次

逐空解析

第33空:判断下一个字符是否在字符串范围内

  • 正确选项:C
  • 解析:需要判断当前位置 i 的下一个字符是否存在(即 i+1 < z.length()),以防止越界访问。

第34空:计算连续数字的值

  • 正确选项:B
  • 解析:当遇到连续数字字符时(如"123"表示123),需要逐位计算:
count = count * 10 + (z[i] - '0');
// 举例:z[i]序列为 '1','2','3'
// count = 0*10+1 = 1
// count = 1*10+2 = 12
// count = 12*10+3 = 123

第35空:循环输出重复字符

  • 正确选项:B
  • 解析:需要将当前字符 ch 重复 count 次并输出,循环次数为 count

第36空:字符只出现1次时的处理

  • 正确选项:B
  • 解析:编码规则中,重复1次的字符不写数字1,所以当 count 为默认值1时,直接输出字符 ch 即可。

第37空:处理完一个数字块后,更新索引

  • 正确选项:C
  • 解析:处理完一个数字(可能是多位数)后,需要将索引 i 自增1,以处理下一个字符。

代码框架(理解版)

string decode(string z) {
    string ans = "";
    char ch = ' ';
    int i = 0;
    
    while (i < z.length()) {
        if (isalpha(z[i])) {  // 是字母
            ch = z[i];
            i++;
            
            // 判断下一个是否是数字【33空】
            if (i < z.length() && isdigit(z[i])) {
                int count = 0;
                while (i < z.length() && isdigit(z[i])) {
                    // 计算数字值【34空】
                    count = count * 10 + (z[i] - '0');
                    i++;
                }
                // 输出count次ch【35空】
                for (int j = 0; j < count; j++)
                    ans += ch;
            } else {
                // 只出现1次【36空】
                ans += ch;
            }
        } else {
            i++;  // 【37空】处理下一个字符
        }
    }
    return ans;
}

三、第二道完善程序题:精明人与糊涂人

题目背景

问题描述:有 n 个人,每个人判断其他人是"精明人"还是"糊涂人"。根据一定的逻辑推理规则,找出真正的精明人。

背景知识:这是一道逻辑推理题,类似"骑士与无赖"问题:

  • 精明人只说真话
  • 糊涂人只说假话(或者行为不可预测)

核心算法思路

// 算法:遍历每个人,假设他是精明人(候选者)
// 验证他对所有人的判断是否自洽
// 如果出现矛盾,则更换候选者

逐空解析

第38空:初始化候选者

  • 正确选项:B
  • 解析:初始时没有候选者(candidate = 0),信任计数 count = 1(表示当前候选者被多少人信任)。

第39空:候选者判断当前人为糊涂人时的处理

  • 正确选项:D
  • 解析:如果候选者认为当前人 i 是糊涂人,而 i 也认为候选者是糊涂人,则出现矛盾——两人互相认为对方糊涂,根据规则需要同时淘汰两人,更换候选者。

第40空:两人互相判断对方为糊涂人时的处理

  • 正确选项:C
  • 解析:互相认为对方糊涂 → 两人都不能是精明人 → 候选者需要更换(重置)。

第41空:候选者被否定时的处理

  • 正确选项:A
  • 解析:当有人否定当前候选者时,信任计数 count 递减。如果 count 降为0,则更换候选者。

第42空:最终输出

  • 正确选项:C
  • 解析:经过完整遍历后,candidate 中保存的就是推理出的精明人,直接输出即可。

算法核心逻辑

初始:candidate = 0, count = 1

遍历 i = 1 to n:
  如果 candidate 认为 i 是精明人:
    count++  // 信任度+1
  
  如果 candidate 认为 i 是糊涂人:
    如果 i 也认为 candidate 是糊涂人:
      // 矛盾!两人同时出局
      candidate = i+1(或更换)
      count = 1
    否则:
      count--  // 信任度-1
      如果 count == 0:
        更换 candidate

最终:输出 candidate

四、完善程序题解题技巧

技巧1:先读注释,理解算法

Step 1: 通读代码,重点关注注释
Step 2: 用一句话概括算法思想
Step 3: 明确每个变量的含义

示例

// 这段代码在做什么?
→ "字符串解码"
→ 核心变量:ch(当前字符)、count(重复次数)
→ 关键操作:识别数字、计算count、输出重复字符

技巧2:看上下文,推断空白含义

上文:... ch = z[i]; i++; ...
空白:______(第33空)
下文:... count = 0; while(isdigit(z[i])) ...

推断:空白处在"读取字符后、处理数字前"
→ 应该判断"下一个是否是数字"

技巧3:排除明显错误选项

选项含以下特征的,优先考虑排除:
❌ 数组越界(如 a[n] 访问第n个元素)
❌ 死循环(如 i++ 写在错误位置)
❌ 逻辑矛盾(如先 i++ 再使用 i-1,但上下文不支持)
❌ 类型不匹配(如 int 和 string 混用)

技巧4:验证填入后的完整性

填入选项后,问自己:
1. 程序能编译通过吗?(语法正确?)
2. 变量在使用前初始化了吗?
3. 循环能正常结束吗?(无死循环?)
4. 边界情况(i=0, i=n)处理正确吗?

五、高频算法类型总结

完善程序题类型 出现频率 备考重点
模拟类(字符串处理) 每次1题 字符串函数、循环控制
查找/排序类 每次1题 二分查找、快排/归并排序
动态规划 偶尔出现 状态转移方程
图论/树 偶尔出现 DFS/BFS、最短路径
数学/逻辑 偶尔出现 模拟推理、数学公式

六、2025年真题整体评价

题型 难度评价 主要考点
单项选择题 ★★☆(中等) 基础语法、组合数学、数据结构
阅读程序题 ★★★(偏难) 模拟执行、gcd、排序、LIS
完善程序题 ★★☆(中等) 字符串处理、逻辑推理

总体评价:2025年CSP-J第一轮难度与往年持平,无偏题怪题,重点考查代码阅读能力基础算法理解


七、2026年备考建议

时间规划

现在~8月:系统学习语法和基础算法
9月上旬:刷近5年CSP-J第一轮真题(至少3遍)
9月中旬:重点攻克阅读程序题和完善程序题
考试前1周:模拟考试,严格控制时间

推荐练习资源

  1. 洛谷:P1000~P2200 中的入门题
  2. CCF 官网:历年真题(https://www.noi.cn/)
  3. CSP-J 初赛模拟卷:各大OJ均有收录
  4. 《信息学奥赛一本通》:初赛篇

八、总结

完善程序题考查的是算法理解能力代码补全能力

核心要点:

  1. 先理解算法思想,再填空
  2. 注意上下文的变量含义和流程控制
  3. 对常见算法模板(字符串、排序、查找)要非常熟悉
  4. 时间允许时,在草稿纸上模拟填入后的执行过程

📌 系列总结: ① 【环境指南】CSP-J/S 第二轮上机环境介绍及操作 ✅ ② 【选择题】2025年CSP-J第一轮笔试试题分析讲解(一)✅ ③ 【阅读题】2025年CSP-J第一轮笔试试题分析讲解(二)✅ ④ 【完善题】2025年CSP-J第一轮笔试试题分析讲解(三)✅

四篇推文完整覆盖CSP-J备考核心内容,建议系统学习、反复阅读!


作者:csp信奥资料共享团队 | 祝所有同学2026年CSP-J取得好成绩! 需要完整试题PDF、标准答案和更多解析,请关注 IMA 知识库「csp」。