
CSP-J 初赛和复赛有什么区别?考什么、怎么分别准备
CSP-J 分初赛和复赛,两者考法完全不同。本文讲清 CSP-J 初赛(笔试/选择)与复赛(上机编程)各自考什么、难度差在哪、评测方式,以及针对性的备考策略,避免只准备一头。
很多家长第一次听说 CSP-J,会以为它只是一场考试,报个名去考一次就完了。其实不是——CSP-J 分成前后两轮,两轮的形式、考点、能力要求几乎是两回事:第一轮(俗称"初赛")以选择、判断为主,坐在座位上做题,考的是计算机常识和读程序的功底;第二轮(俗称"复赛")要真刀真枪地在电脑上写 C++ 程序,由判题系统自动评分。只准备其中一头,很容易在另一头翻车。
这篇文章面向零基础的家长和学生,把 CSP-J 两轮的区别讲清楚:各自考什么、难度差在哪、怎么评分,以及针对性地该怎么准备。文末还会给一道复赛级别的自编示例小题,让你直观感受一下复赛的难度。
先弄清楚:CSP-J 为什么分两轮
CSP-J 是中国计算机学会(CCF)举办的"非专业级软件能力认证"入门级(Junior)组别,每年举办一次。它之所以分两轮,本质是一次"先筛知识面、再考真本事"的分层选拔:
- 第一轮(初赛):形式为选择题、判断题等客观题(笔试或机考),主要考计算机基础知识和程序阅读能力,不要求现场写完整程序。它的作用更像一道门槛,先把知识面明显不足的人筛掉。
- 第二轮(复赛):全部是上机编程题,用 C++ 现场写出完整程序,由 OJ(在线判题系统)自动评测。这一轮才真正决定最终奖项。
两轮之间是晋级关系:第一轮达到所在省份划定的分数线,才能进入第二轮;最终一、二、三等奖按第二轮成绩评定。 也就是说,初赛是"入场券",复赛才是"正赛"。
需要提醒的是,每年的题量、时长、分数线都由 CCF 统一设定、逐年可能调整,各省还独立划线,所以本文只讲两轮的结构与考法差异,不列具体分数——一切以 CCF 官方赛制与当年通知为准。
第一轮(初赛):考知识面和读程序的功底
第一轮不写代码,但不代表轻松。它考的是"面"——知识覆盖是否够广、基本功是否扎实。主要包括几块:
- 计算机基础常识:计算机发展史、硬件组成、操作系统与网络的基本概念等;
- 进制与编码:二进制、八进制、十六进制之间的转换,原码、反码、补码的概念;
- 数学与逻辑:排列组合、简单概率、逻辑运算与命题推理;
- 阅读程序:给出一段 C++ 代码,判断它的输出结果,或者补全其中缺失的部分——这是最能拉开差距的部分,本质上考的是扎实的语法功底和"用脑子手动模拟程序运行"的能力。
初赛的特点是题目多、单题耗时短、覆盖面广。一道题不会就是不会,很难像编程题那样"想一会儿就有思路"。所以初赛比拼的是平时积累:概念记得牢不牢、进制转换熟不熟、看到一段代码能不能一行一行在脑子里跑出结果。
初赛最容易失分的地方
- 计算机常识题靠平时积累,临时抱佛脚效果有限,硬件、网络、操作系统的名词平时要留意;
- 进制转换和补码是很多孩子的软肋,考试时又容易算错,需要反复练到形成肌肉记忆;
- 阅读程序题最耗神也最拉分——循环边界、变量在每一轮的取值、递归的调用顺序,一步看错后面全错。这部分丢分往往不是"不会",而是"没耐心一行一行模拟"。
第二轮(复赛):真正在电脑上写程序
第二轮和初赛完全是两种考试。孩子坐在电脑前,用 C++ 现场编写完整程序,程序要能编译、能运行,并且对所有测试数据都输出正确结果,才能拿到分数。核心考点包括:
- 模拟与枚举:按题意直接模拟过程,或暴力枚举所有可能情况;
- 贪心:在排序的基础上做局部最优选择;
- 递推与递归:数列递推、递归函数设计、简单记忆化;
- 排序与二分:常见排序思想、二分查找与二分答案;
- 简单搜索:深度优先搜索(DFS)、广度优先搜索(BFS)的入门题型;
- 基础数据结构:数组、字符串、结构体、栈、队列,以及 STL 常用容器的使用。
复赛题目通常按难度递增排列:前面的题偏重语法和模拟,后面的题才真正考算法。对入门组来说,把前面的题做稳、后面的题尽量多拿部分分,往往就有不错的名次。
复赛的评测方式:OJ 判分,不看"我觉得对"
复赛最关键、也最容易被家长忽视的一点是评测方式。它不像学校考试由老师看着给分,而是由 OJ(Online Judge,在线判题系统) 自动评测:你的程序会被喂进一批事先准备好的测试数据,只有在限定的时间和内存内,对每一组数据都输出完全正确的结果,才算通过。
这意味着几件事:
- "自己觉得对了"不算数——只有通过测试点才得分,代码里一个边界没处理好,可能一分都拿不到;
- 部分分很重要——很多题设置了多档数据,即使做不出满分算法,把暴力解法写对也能拿到一部分分数;
- 超时和爆内存也是错——算法效率不够,同样过不了大数据点。
这套反馈机制和平时写作业"感觉对了就交"完全不同,需要提前适应。
复赛最容易失分的地方
- 边界情况没处理:数组开小了、循环少跑一轮、特殊输入(如 0、最大值、空情况)没考虑;
- 只会暴力、不敢抢部分分:看到难题直接放弃,其实先写个能过小数据的暴力解法,也能拿到宝贵的部分分;
- 时间分配失衡:在一道难题上死磕太久,导致后面会做的题没时间写;
- 上机手感不足:平时练得少,考场上调试半天编译不过,白白浪费时间。
初赛 vs 复赛:一张表看清区别
| 对比维度 | 第一轮(初赛) | 第二轮(复赛) |
|---|---|---|
| 考试形式 | 选择题、判断题等客观题 | 上机编程,现场写 C++ 程序 |
| 要不要写代码 | 不写完整程序,但要会读程序 | 必须写出完整、可运行的程序 |
| 核心能力 | 知识面 + 程序阅读 + 手动模拟 | 算法设计 + 编码实现 + 调试 |
| 主要考点 | 计算机常识、进制编码、逻辑、读程序 | 模拟枚举、贪心、递推递归、排序二分、搜索 |
| 评分方式 | 客观题按对错计分 | OJ 自动评测,按通过的测试点给分 |
| 拼的是 | 平时积累的广度与细心 | 算法功底与上机实战能力 |
| 晋级关系 | 达到本省分数线才能进复赛 | 决定最终一、二、三等奖 |
| 易失分点 | 进制补码算错、读程序看漏一步 | 边界没处理、放弃部分分、超时 |
(表中为一般性描述,具体赛制与分数以 CCF 官方当年通知为准。)
两轮该怎么分别准备
两轮考法不同,准备重点自然也不同。最忌讳的就是只准备一头——只刷编程题、忽视初赛知识面,可能连复赛的门都进不去;只背概念、不练上机,即使侥幸过了初赛,复赛也会束手无策。合理的做法是两条线并行,各有侧重。
初赛准备:补知识面 + 刷选择题 + 练读程序
- 系统补齐知识面:计算机基础常识、进制与编码、逻辑与数学,这些需要平时一点点积累,考前再集中过一遍;
- 大量刷历年第一轮真题:初赛题型相对固定,多刷真题能摸清出题风格,也能暴露知识盲点;
- 专项练"阅读程序":这是最拉分的题型,要练到能耐心地一行一行在纸上模拟循环和递归,把每一步的变量值写出来;
- 错题回炉:把做错的概念题、算错的进制题记下来,隔一两周重做,直到形成条件反射。
复赛准备:攻算法专题 + 上机实战 + 用一致的判题环境
复赛靠的是真实的编程能力,只能靠动手练出来。建议按专题推进:模拟枚举 → 排序 → 贪心 → 递推递归 → 二分 → DFS/BFS → 栈和队列,每个专题"讲一个例题、独立做 5-10 道同类题、错题回炉"。这条按级递进的路线,和我们在 CSP-J 备考路线图 里给出的算法学习顺序是一致的。
比刷题顺序更重要的,是用与复赛一致的在线判题环境去练。信奥备考和平时写作业最大的区别,就是代码必须通过 OJ 的自动评测。建议让孩子养成"所有练习都在 OJ 上提交、以通过全部测试点为唯一标准"的习惯——边界数据、超时问题会逼着他把代码写严谨。AdaCpp 的 GESP 真题在线练习 里有大量分级练习题可以按知识点刷,配套的判题系统和 CSP-J 复赛的评测方式一致,提前适应这种"过测试点才得分"的反馈模式很有必要。平时写代码、调试报错,也可以直接用免安装的 在线 IDE,打开浏览器就能写,遇到编译错误还有 AI 助教即时解释。
一道复赛级别的示例小题
光说难度比较抽象,我们自编一道复赛入门难度的小题,让你直观感受一下复赛在考什么。
题目:连续子段最大和
给定 n 个整数(可能有负数),从中选出连续的一段(至少一个数),使这段数之和最大,输出这个最大和。
例如输入 [-2, 1, -3, 4, -1, 2, 1, -5, 4],最大和为 6(取子段 4, -1, 2, 1)。
这道题的"陷阱"在于有负数——不能简单地把所有正数加起来。朴素的想法是枚举所有起点和终点,但当 n 很大时会超时。复赛更希望孩子想到一个 O(n) 的线性做法:从左往右扫,维护"以当前数结尾的最大子段和",如果前面累积的和是负数,就干脆丢掉重新开始。参考代码如下:
#include <iostream>
using namespace std;
int main() {
int n;
cin >> n;
long long best = 0; // 全局最大子段和
long long cur = 0; // 以当前元素结尾的最大子段和
bool first = true;
for (int i = 0; i < n; i++) {
long long x;
cin >> x;
// 若前面累积为负,丢弃重新开始;否则接上
if (cur < 0) {
cur = x;
} else {
cur = cur + x;
}
// 更新全局答案(第一个数直接作为初值,避免全为负数时出错)
if (first || cur > best) {
best = cur;
first = false;
}
}
cout << best << endl;
return 0;
}这道题浓缩了复赛的几个典型特征:要想到比暴力更优的算法(否则大数据超时)、要处理好边界(全是负数时答案应该是最大的那个负数,而不是 0,代码里用 first 标志保证了这一点)、要用 OJ 能接受的输入输出格式。真实的复赛题会比这道更长、故事背景更复杂,但内核是相通的:读懂题意 → 想出正确且够快的算法 → 写成能通过所有测试点的代码。
常见问题
是不是过了初赛就稳了?
不是。初赛只是晋级的门槛,最终奖项完全看复赛成绩。很多孩子初赛分数不错,却因为平时上机练得少、复赛写不出程序而遗憾。初赛过线只是拿到了正赛的入场券,复赛的算法与编码能力才是决定名次的关键。
初赛没过线,这大半年是不是白学了?
不是。初赛考查的计算机基础和程序阅读能力,本身就是编程学习的一部分;而为复赛准备的算法训练,无论是否晋级都实打实提升了能力。CSP-J 每年都有,中间还可以用 GESP 考级保持阶段性目标,来年再战是很正常的节奏。关于 GESP 和 CSP-J 的衔接关系,可以参考 GESP、CSP-J、NOI 是什么关系。
两轮应该先准备哪个?
建议以复赛(算法与上机)为主线长期投入,因为它需要的能力最难、最花时间,也最本质;初赛的知识面和读程序则可以穿插准备,在考前一两个月集中冲刺。换句话说,平时练复赛,考前补初赛是比较稳的节奏——但两头都不能完全丢。
复赛的部分分到底怎么回事?
复赛的题通常设置多档测试数据,从小规模到大规模。即使你想不出满分需要的高效算法,只要把一个能跑对小数据的"暴力解法"写正确,就能拿到对应那几档数据的分数。所以看到难题不要直接放弃——先拿部分分,是复赛非常重要的应试策略。
写在最后
CSP-J 分两轮,考的是两种不同的能力:初赛比的是知识面的广度和读程序的细心,复赛比的是算法功底和上机实战。理解了这个区别,备考才不会用错力——既不会因为只刷概念题而卡在复赛,也不会因为忽视初赛而连正赛都进不去。把复赛的算法能力当作长期主线,把初赛的知识面当作考前冲刺,用与复赛一致的判题环境把手感练出来,就是最稳妥的路径。具体赛制、题量和分数线每年都可能调整,报名前请以 CCF 官方当年通知为准。
作者
分类
更多文章

GESP C++ 一级考什么?考纲知识点、题型分布与备考建议(2026)
GESP C++ 一级是很多孩子编程考级的第一站。本文详解一级考纲知识点、机考题型、零基础常见易错点,并给出一份适合零基础孩子的一级备考路线与练习建议。

孩子几岁开始学编程合适?分年龄段启蒙路线与家长指南
孩子几岁学编程最合适?太早会不会揠苗助长?本文按年龄段(学龄前、小学低/中/高年级、初中)给出启蒙建议,说明每个阶段适合什么语言和内容,帮家长找到不焦虑的起点。

GESP C++ 二级、三级考什么?从一级进阶的知识点与备考重点
过了 GESP 一级之后,二级、三级要学什么?本文梳理 GESP C++ 二三级新增的知识点(循环、数组、字符串、函数、简单枚举等)、题型难度变化与备考重点,帮孩子平稳进阶。
邮件列表
加入我们的社区
订阅邮件列表,及时获取最新消息和更新