1. CSP-J初赛到底考什么先把这个框架吃透带过好几年CSP-J选手我最大的感受是很多初次接触这个比赛的家长和同学都被“初赛”这个名字误导了。以为初赛只是走个过场随便刷刷题就能过结果一上考场才发现笔试内容从二进制位运算到程序阅读、从算法复杂度的估算到完善程序跨度非常大比校内信息课上学的要深得多。CSP-J是中国计算机学会CCF组织的非专业级软件能力认证面向的就是初中阶段学生。初赛是笔试满分100分题型全部为客观题复赛才是上机写代码也就是俗称的“机试”。初赛过线后才有资格报名参加复赛。以2023年为例全国各省初赛分数线差异很大热门地区竞争激烈所以初赛绝不只是“及格万岁”而是决定了你能否进入下一轮去展示代码能力。这篇内容我以2023年CSP-J初赛真题为主线把整张试卷拆开揉碎讲一遍顺便说说我陪练几年下来积攒的经验和踩过的坑。适合看这篇文章的人很明确准备参加CSP-J的同学、负责信息学竞赛班或者社团的老师以及完全不懂编程但想帮孩子做规划的家长。我会从考纲框架讲起再逐类拆解真题考点最后给出一份可落地的备赛计划。无论你是零基础还是已经能独立写出递归程序这篇内容都能帮你把“初赛到底难在哪”这件事看得清清楚楚。1.1 初赛的三大题型与分值结构CSP-J初赛满分是100分考试时间120分钟全部是笔试。题型分布长年保持稳定2023年依然是三大块单项选择题、阅读程序题、完善程序题。很多人只盯着选择题这是战略错误。我们从分值权重来算一笔账单项选择题共15题每题2分一共30分。内容覆盖计算机基础、编程语言基础、数据结构、算法初步、数学逻辑等。阅读程序题共3大题给出完整的C程序代码让你判断输出结果、指出某段代码作用或者判断选项正误。一共40分约12-13小题左右每题2分或3分。完善程序题共2大题给出部分代码片段和算法背景让你从选项里选出正确语句补全程序一共30分。从分值就能看出真正决定你能否过线的不是单选题而是后面70分的程序题。我见过太多孩子选择题做得漂漂亮亮一到阅读程序就发懵因为平时训练只刷选择题从来不静下心去“跑程序”。这个习惯一定要改。1.2 2023年试卷的整体难度与趋势结合2023年真题来看整张卷子给我的感觉是单选题基础题居多但埋了不少“反套路”的坑阅读程序题难度中等偏上代码风格非常贴近实际竞赛代码不是那种教科书式的玩具程序完善程序题偏重基础算法的实现比如贪心、排序、递归、图论基础没有出现特别偏门的算法。还有一个很明显的变化趋势题目越来越强调“读懂别人代码”的能力。以前阅读程序题常常是让你跑一遍算结果现在则更多出现“这段代码使用了什么算法思想”“如果输入是某值哪一项说法是错误的”这类需要整体理解的问题。这意味着只靠“模拟执行”走天下已经不够了你必须能理解代码背后的设计意图。2. 2023年真题逐类拆解选择题里的基础与陷阱我知道很多人想要“真题答案速查”但我更想告诉你的是每道题背后的考点。答案背下来没有用换个数换个问法你又懵了。真正有效的刷题方式是看到一个题目先判断它在考什么知识点再想这个知识点有没有易错点最后才是算出答案。2.1 计算机基础知识重点看什么2023年单选里计算机基础部分考到了计算机系统组成、存储单位换算、进制转换、编码方式、逻辑运算等。这些内容在我们日常编程训练里几乎用不到但初赛一定会考而且占比不低。比如有一道题考查“一个字节由多少个二进制位组成”这属于送分题但紧接着可能就会问“某容量的存储空间能存放多少字符”这就涉及单位换算了。我的建议是把计算机基础当成“背多分”模块来准备。进制转换、原码反码补码、ASCII码与汉字编码的区别、常见快捷键这种基础常识必须做到零失误。这里有个特别容易被坑的点逻辑运算中的短路求值。2023年有一道模拟题面说表达式计算中当第一个操作数已经能确定整个表达式的值时C会跳过后续操作数。这个知识点在选择题里是一道经典题很多孩子因为不知道“短路”这个概念而丢分。一定要注意C对逻辑与和逻辑或||都采用短路求值。如果前面的条件已经决定结果后面的表达式根本不会执行。在选择题里可能会用“x || y”这种形式问你最终x、y的值这是每年出现频率极高的陷阱。2.2 数据结构与算法选择题的考法2023年选择题里数据结构考了栈、队列、二叉树、图的简单存储。乍一看都是很基础的概念但题目设计得非常活。比如栈的题不是直接问你“栈的特性是什么”而是给你一个入栈序列和一个出栈序列问你是否可能。这种题考查的是你对栈的“后进先出”特性在动态过程中的理解不是背定义。我强烈建议用“手画模拟”的方式来做这类题。比如给出入栈序列1, 2, 3问出栈序列能否是3, 2, 1答案当然是可以但若是1, 3, 2就是一个经典的反例。平时训练时把每个选项都当做一个小的状态变换题在草稿纸上画栈的进出过程而不是靠直觉猜。二叉树的选择题则集中在遍历方式。先序遍历、中序遍历、后序遍历给了其中两个遍历结果求另一种遍历几乎是历年必考。2023年有一道题给了中序和后序要求选先序结果。这类题的核心思路是后序序列的最后一个节点一定是根节点然后到中序里找根节点的位置从而分割左右子树递归处理。每年都有孩子在递归分割时搞错左右子树的顺序导致整个答案错误。记住先序遍历是“根左右”中序“左根右”后序“左右根”三个位置关系必须烂熟于心。2.3 数学基础与排列组合在题目里的具体体现别以为信息学竞赛只考编程初赛的数学比重一直不小。2023年选择题里有排列组合、概率、逻辑推理相关题目。比如“从5个不同元素中任取2个的组合数是多少”这是送分但更常考的是“卡特兰数”“二项式定理”这类跟递归、栈结构密切相关的数学知识。举个例子若要求“包含n个节点的二叉树共有多少种形态”这就是卡特兰数列。这道题在编程竞赛里非常经典因为它把数学和数据结构结合在了一起。我建议备赛时把高中数学必修里的排列组合、概率统计基础提前自学一些因为校内初中阶段还没教到而CSP-J初赛默认你已经掌握。这个“默认”让很多选手栽跟头所以一定要提前准备。逻辑推理题也是常客。2023年有一道类似“几位同学预测比赛名次只有一个人预测正确”的题目。这类题其实不用高深数学用排除法一步步推就能解。关键是耐心别被冗长文字绕晕。我的做题方法是把每个人说的话拆成独立命题再逐一假设某个人的预测为真看会不会产生矛盾。这种训练对编程里的“逻辑判断”也有帮助。3. 阅读程序题历年真题里最能拉开差距的部分阅读程序题是CSP-J初赛的重头戏也是“区分度”最明显的题型。2023年这部分的程序代码长度明显比前几年要长有的代码甚至超过50行。很多孩子在看到大段代码时心理上就慌了但越慌越容易瞎蒙。下面我把这道大题拆成“怎么读代码”“怎么算结果”“怎么选答案”三个层面来拆解。3.1 如何快速看懂一段陌生代码拿到一段没见过的程序第一件事不是一行一行读而是先看整体。完整程序的阅读步骤我是这样带学生练的先看主函数main明确输入是什么、输出是什么。再看是否有递归、循环嵌套大致判断算法类型是枚举是递归分治是贪心如果有自定义函数先看函数名和参数猜猜每个函数做什么。最后再逐行推演但不要从头到尾傻傻地模拟而是“抓关键变量”。2023年有一道阅读程序题代码里有一个递归函数函数内部分别调用了两次自身中间夹着一次变量操作。看到这种结构立刻应该想到“二叉树的遍历”或者“分治算法”而不是立刻陷入递归栈中。如果你先有了一个整体判断再去模拟某个具体输入会比毫无章法地推演快得多而且不容易算错。很多学生喜欢在草稿纸上完整模拟程序每一步这本身没错但要注意效率。模拟时最好用表格记录每个关键变量在不同时刻的值不要东写一个、西写一个。我的习惯是把变量名作为表头每一行代表一次循环或一次递归调用后的状态这样既清晰又不容易漏掉边界条件。3.2 2023年阅读程序的典型考法与输出计算这里举一个当年真题的简化模型。程序大致是这样读入一个整数n然后使用循环从1到n累加但循环内部有判断条件如果满足某个条件就跳过一部分累加。问当输入为6时输出是多少。这种题本身不很难但选项里会设置几个“看起来差不多”的答案故意混淆。遇到这种题我要求学生先把循环体执行的条件转换成数学表达式比如“只有i是奇数时才累加”或者“当i能被3整除时continue”。然后在草稿纸上列出所有循环变量i的取值标出哪些满足条件再累加。切忌心算。尤其是循环嵌套加条件判断时心算出错率几乎百分百。还有一种考法是“判断程序功能”。例如给出一段用数组维护“前缀和”的代码问你它实现了什么功能。前缀和的思想是sum[i] sum[i-1] a[i]之后区间求和可以通过sum[r] - sum[l-1]快速得到。2023年阅读程序题里就有类似内容。你必须能认出这种常见算法模式而不是真的反复算整个数组。所以阅读程序题表面考“读懂代码”本质考“算法识别能力”。这提醒我们平时学习算法时不能只会敲代码还要熟练掌握这种算法在代码中的常见写法。3.3 常见易错点边界条件与数据类型阅读程序题另一个大坑是边界条件。有些代码会在循环边界上写“”还是“”有时候差一个数输出结果完全不同。比如从1循环到n有的程序写for(int i1; in; i)有的写in你在模拟时要特别小心。还有数据类型的溢出问题。2023年有一道题用到了int类型做大数累加在某些输入下会溢出变成负数但题目没有明确说“可能会溢出”而是让你判断输出的正负。这就是个隐性陷阱。如果读题不仔细按数学逻辑推算是正数但程序实际运行由于整数溢出输出的是负数。这种题对没有上机经验的选手非常不友好因为很多孩子不知道int能表示的最大整数是2147483647以及溢出的行为。备赛时一定要记住常见数据类型的范围。阅读程序时我还建议注意“数组下标从0还是从1开始”以及“字符和整型的转换”。这些细节单独看都不难组合在代码里就很容易让人算错。我的经验是每次模拟前先在草稿纸顶部写下关键变量初始值和数组长度这样能降低很多低级失误。4. 完善程序题从“看代码”到“填代码”的能力跃迁完善程序题是CSP-J初赛最后一道大坎也是很多考生最怵的部分。它给你一段几乎完整的代码只有几行空缺让你从四个候选中选一个填进去。2023年这两道完善程序题一道是经典的“扑克牌排序”类问题另一道是图论相关的最短路径或连通性问题。这一类题目如果你对算法本身不熟基本只能靠猜。4.1 完善程序题的本质在隐藏算法框架中补全关键步骤你要明白编题者已经把算法思路融进代码框架里了空缺的地方往往是整个算法的“灵魂”。比如有一类常见的完善程序题是“用贪心策略选择活动”代码框架基本是先排序然后遍历如果当前活动的开始时间不早于上一个选中活动的结束时间就选中它。空出来的第二行往往就是“记录下一个可用时间点”的赋值语句。如果你对贪心算法的实现熟悉一眼就能看出应该填什么。2023年那道“扑克牌排序”题看起来是个排序问题实际上用的思想类似“桶排序”或者“计数排序”。代码里先统计每个花色和每张点数的出现次数再根据统计结果构造有序序列。空缺的一行就是“将某个计数变量减1”或者“移动指针”之类的操作。如果学生不知道“计数排序”本质上是拿空间换时间通过记录每个值出现的次数来输出序列就会觉得这段代码莫名其妙。所以完善程序题备考的核心不是“刷选择题”而是要把基础算法的标准模板代码理解透。不只是知道怎么写还要知道哪一行是干什么的、去掉这一行会有什么后果。这就是算法素养。4.2 结合真题讲解一个完整填补思路为了更具体我拿一个符合2023年风格的简化模型来说。假设有一段代码要求计算从起点到终点的最短路径使用广度优先搜索BFS。问题定了使用二维数组存地图值为0表示可走1表示障碍。BFS需要队列存储待扩展的节点。完善程序题常常这样挖空队列初始化时入队的元素是什么循环弹出队首后需要判断什么邻居节点入队时dist数组怎么更新以经典的“迷宫最短路”为例标准BFS模板是queueint q; q.push(start); // 起点入队 dist[start] 0; while (!q.empty()) { int cur q.front(); q.pop(); if (cur target) break; // 遍历四个方向 for (int i 0; i 4; i) { int nx cur dx[i]; if (边界合法 未访问) { dist[nx] dist[cur] 1; q.push(nx); } } }完善程序题的每个挖空点其实都在考你对上面模板的掌握。比如“判断未访问”的条件可能是“dist[nx] -1”而不是“visited[nx] false”。因为C标准库的这个题解里常用dist数组的初始值-1来同时存储距离和标记访问状态。在做这类题时我教学生用“代入法”把四个选项挨个代入代A码中看看哪一项会让程序在某个输入下崩溃或者出现逻辑错误。这个方法虽然笨但很多时候很有效。尤其是两个选项看起来差别很小比如一个用“”一个用“”一个写“”一个写“”代入后仔细观察程序分支是否合理。不过前提是你得知道代码的大致意图否则代入也是瞎代。4.3 常见的一个定向训练方法默写经典算法模板我带的学生如果想短期突破完善程序题我会要求他们默写以下经典算法模板每个都必须手写一遍并讲清每行代码作用基础排序冒泡、选择、插入进阶的归并、快排、计数排序。递归与回溯全排列、子集生成、经典八皇后。搜索DFS、BFS、连通性判断、最短路。数据结构单链表反转、栈的模拟、队列的循环队列实现、二叉树的先序/中序/后序遍历递归和栈模拟两种。图论基础邻接矩阵和邻接表的建立、并查集的查找与合并。我不要求你把每个模板背得一字不差但关键几步的代码必须形成肌肉记忆。比如并查集有两个核心函数查找根节点的find以及合并两个集合的union。2023年完善程序题中虽然没有考并查集但前几年出现过属于高频后备军。万一今年遇到你对这段代码熟悉填起来就像填空一样轻松。5. 备考策略和考场实战把真题价值榨干写了一大段题目分析最后你可能会问那到底怎么准备网上有人刷完十年真题就能过有人题刷了三遍照样挂。差别就在于刷题的方式。下面这部分是我带学生多年总结出来的实用策略也顺带吐槽几点别人攻略里很少提到的事。5.1 真题应该怎么做才能真正提升能力首先真题不要用来“测验”要用来“研究”。很多人把每套真题在模拟考试时间做完对完答案看个分数然后就扔了。这是最浪费的做法。一套真题至少要做三遍。第一遍是模拟考场。完全按照正式考试的时间和环境来做不翻书、不查资料做完后认真对答案记录错题。这一遍的目的是暴露问题。第二遍是知识点归类。把每道错题按照考点归入“计算机基础”“数据结构”“算法”“数学”等类别然后去寻找同类知识点的专项练习。只做真题很难形成系统性知识因为没有老师在旁边帮你整理归纳。这一遍你需要自己建立“考点-题型-易错点”表格。第三遍是时间沉淀后的重做。建议隔两三个月把同一套真题再拿出来做一遍。这一遍你会发现曾经懵懵懂懂的题现在一眼就能看穿甚至能判断出题人的心思。到了这个阶段这套真题才算真正吃透了。对2019年至2023年的五套真题如果每一套都这样处理你的初赛水平会有质的飞跃。5.2 初赛与复赛的时间投入如何权衡这是一个特别现实的问题。CSP-J初赛在9月复赛在10月之间只有一个月左右。如果等到初赛过线再准备复赛根本来不及。所以很多有经验的教练策略是初赛前一个月突击笔试知识点平时依然以代码训练为主。初赛笔试里的很多算法题其实跟复赛内容高度重合平时写代码能力强的人阅读程序题都不会差到哪去。我个人的建议是如果你已经从零开始训练C语法和简单算法那么从6月开始每周抽出固定时间专门刷初赛真题就好不需要为了初赛放弃全部机试训练。因为复赛是真正拉开奖项差距的地方初赛只要保证过线即可。尤其对于数学功底好的孩子初赛更像是“用一门新语言做阅读理解”提前把概念过一遍就行。当然有一种情况要特殊对待所在省份初赛分数线很高竞争极其激烈那初赛就必须多投入。比如某些教育强省初赛淘汰率很高光靠临时抱佛脚比较危险需要提前几个月认真背概念、刷题库。5.3 考场上的时间分配和做题顺序CSP-J初赛时间是120分钟题量不小。我建议的时间分配是单选题25分钟以内阅读程序题45分钟完善程序题35分钟最后剩下15分钟检查。这只是一个大框架具体要根据自己的节奏调整但有几个原则不能破。第一不要在一道选择题上纠结超过5分钟。选择题只有2分你花10分钟做对也只是2分但影响后面大题的作答时间。遇到不会的先选一个标记回头再来想。第二阅读程序题千万不要从头开始一行一行模拟到底。前面也说了先理解整体结构。如果某道阅读程序题代码特别长输入样例又复杂可以先看下面的问题带着问题去看代码效率会高很多。比如问“如果输入是3输出是几”你就只需要关心输入为3时的执行路径不需要把其他分支都完全看懂。第三完善程序题如果完全没思路可以使用“选项差异对比法”。四个选项中往往有两个明显错误剩下两个可能只是差一个符号之类。这时认真看上下文判断那个空应该具有什么“语义”比如应该赋值还是判断应该加一还是减一选出来的概率会大大提高。另外草稿纸的使用也有学问。我建议把草稿纸分成几个区域上面写“程序大致流程”中间写“变量变化表”下面留白用于临时计算。不要想到什么写什么到最后自己都找不到关键记录。这样既能加快速度也能减少低级失误。5.4 这半年我反复踩过的坑和总结给后来者的话带这几届学生我自己也跟着踩了不少坑。第一个坑是“重知识点、轻阅读代码”。很多孩子背熟了各种知识点遇到阅读程序题仍然无从下手原因就在于平时没有养成读别人代码的习惯。我后面要求学生在OJ上刷题时每道题至少看两个不同人的题解代码不看思路先看代码能不能看明白。坚持几个月后再遇到CSP-J里的程序阅读题大家普遍反映“没那么恐怖了”。第二个坑是“只刷选择题”。选择题的确容易刷出成就感但初赛的真正分值大头在后面。如果你想要高分而不是只求“过线”必须把阅读程序和完整程序当作与算法训练同等重要的难度来对待。我会让学生在比赛前一个月每周做一套完整真题并且额外做一道“完善程序”专项练习。这种针对性的短期强化效果立竿见影。第三个坑是“忽视减法思维”。初赛选择题的选项里常常有两个特别相似的答案如何排除靠的是对边界条件和特殊情况的敏感度。比如算法的时间复杂度很多孩子记住了O(n)、O(n^2)、O(log n)的定义却不会具体分析一段代码嵌套了几层循环、每层循环规模多大。实际上多数复杂度题目都可以通过“极端规模代入”法估算。假设n1e6想一想循环体大概执行几次从而判断是O(n)还是O(n^2)这种方法对拿分非常奏效。以上的经验都是我在一次次带孩子模拟考试、复盘错题过程中得到的。CSP-J初赛不是一道不可逾越的坎它更偏向“认真准备就有回报”的考试。但前提是你必须找到正确的复习方向而不是把时间浪费在盲目刷题上。掌握考点框架、吃透近三年真题、勤练程序阅读你就会发现初赛考来考去无非就是那几类东西只是每年换了一层新包装。希望这篇带有真实做题痕迹的复盘能帮你少走几个月弯路。