
1. 从初赛到复赛先搞清楚这场考试到底在考什么每年九月初赛结束到十月底复赛开考中间大概有六到七周时间。这段时间怎么用基本决定了你最终拿到的是省一、省二还是直接打铁。我带过几届学生也见过太多人初赛考得不错复赛却因为准备方向跑偏最后连个像样的分数都没拿到。所以这篇东西我想把复赛准备这件事从头到尾拆开讲清楚尤其是针对2026年的CSP-J2和CSP-S2。先说一个最核心的认知复赛和初赛完全是两种考试。初赛考的是选择题加程序阅读拼的是知识面和细心程度复赛是三个半小时到四个小时四道编程题每道题100分满分400分。你需要在有限时间内写出能通过测试数据的代码而不是“大概知道怎么做”。这个区别决定了你的准备方式必须彻底切换。CSP-J2面向入门级CSP-S2面向提高级。J组的四道题通常难度递进第一题签到第二题基础算法或简单数据结构第三题开始上强度第四题往往是压轴。S组则从第一题就可能需要一定思维量后两题经常涉及复杂DP、图论建模或者数据结构综合应用。很多同学问我要不要同时准备J和S我的建议是如果你目标是S组省一那就全力冲SJ组最多考前做两套真题找找手感如果目标是J组省一或者刚升入初中那就先把J组吃透不要贪多。注意2025年CSP-J复赛真题里出现了一道需要结合贪心和优先队列的题目很多选手因为没练过堆的操作直接放弃。这释放了一个信号——J组和S组的边界在模糊基础数据结构必须提前掌握。那复赛到底考什么我把它拆成三个层面。第一层是语言基础包括C的语法、STL容器的使用、文件输入输出。这一层不过关后面全是空谈。第二层是算法思维包括枚举、贪心、二分、搜索、动态规划、图论基础。第三层是工程能力也就是在考场上快速把思路转化成代码、调试、对拍、优化的能力。很多同学前两层还行第三层拉胯结果就是“这题我会做但写不完”或者“样例过了但提交全WA”。所以复赛准备的核心逻辑是用真题驱动以代码落地为标准以拿分为目标。不要追求把所有算法都学一遍而是把高频考点练到肌肉记忆。接下来我会从时间规划、知识体系、刷题方法、考场策略几个维度展开每个部分都给出可以直接抄作业的方案。2. 六周时间怎么切一份可落地的复赛备战时间表2.1 第一周诊断与补漏别急着刷题初赛结束后第一件事不是马上开刷复赛题而是做一次能力诊断。找一套近三年的CSP-J或CSP-S复赛真题严格按考试时间模拟一遍。注意这里的目的不是看你能拿多少分而是暴露问题。做完之后逐题分析是读题理解错了是算法想不出来是想出来了写不出来还是写出来了调不对我一般让学生填一张诊断表大概长这样题目是否读懂思路是否清晰代码是否完成样例是否通过提交得分主要问题T1是是是是100无T2是部分是否30边界条件漏判T3否否否-0没学过最短路T4否否否-0直接放弃这张表能直接告诉你接下来五周该干什么。如果T1都拿不到满分那说明语言基础有问题先回去把STL和文件操作练熟。如果T2、T3有思路但写不对那就是代码实现能力不足需要专项训练。如果T3、T4完全没思路那就是知识盲区需要按专题补。第一周剩下的时间用来补语言基础。具体来说确保你能熟练使用以下内容cin/cout的重定向、freopen的写法、vector、string、map、set、queue、priority_queue、stack、pair、sort、lower_bound/upper_bound。这些是复赛的“工具箱”不熟练的话每道题都要多花十几分钟查语法考场上根本来不及。实操心得我要求学生把文件输入输出的模板背下来考试时先敲模板再读题。模板大概长这样#include bits/stdc.h using namespace std; int main() { freopen(problem.in, r, stdin); freopen(problem.out, w, stdout); // 你的代码 return 0; }注意文件名要和题目要求完全一致大小写敏感。每年都有人因为文件名写错爆零。2.2 第二到四周专题突破按考频排序这三周是核心提升期。我的建议是按考频从高到低安排专题而不是按教材顺序。根据近五年CSP-J/S复赛的题目统计高频考点大致如下优先级专题J组出现频率S组出现频率1模拟与枚举极高高2贪心高高3二分答案高高4动态规划线性、背包中高极高5搜索DFS/BFS高中6图论最短路、拓扑中高7数据结构堆、并查集、树状数组中高8数论与组合数学低中高9字符串哈希、KMP低中每个专题的练法不是“看一遍教程然后做一道题”而是三题一组第一题看题解理解套路第二题独立完成但允许查资料第三题限时独立完成。这样一轮下来一个专题大概需要两到三天。三周时间可以覆盖六到八个专题足够应付J组S组则需要更紧凑一些。以动态规划为例J组重点练线性DP和01背包S组还要加区间DP、树形DP、状压DP。我通常会让学生先做一道最基础的模板题比如数字三角形或者01背包确保状态定义和转移方程写对。然后做一道变形题比如“最长上升子序列的优化版本”最后做一道综合题比如“带限制的背包问题”。常见坑很多同学做DP题时喜欢直接看题解看完觉得“我懂了”但下次遇到还是不会。正确的做法是看完题解后合上自己从头推导一遍状态转移然后手写代码再和题解对拍。这个过程很痛苦但效果最好。2.3 第五周真题套卷模拟严格计时到了第五周必须开始整套真题模拟。找近五年的CSP-J2和CSP-S2真题每天上午按考试时间做一套下午复盘。复盘的时间应该比做题时间还长重点分析每道题的失分原因和优化空间。模拟时要注意几点第一必须用考场环境也就是只带纸笔和电脑不能查资料不能问人。第二必须提交到评测系统不能只跑样例。第三必须写文件输入输出不能图省事用标准输入输出。第四必须记录每道题的时间分配看看自己是不是在某道题上卡太久导致后面没时间。我一般会让学生填一张模拟记录表题号开始时间结束时间用时得分策略调整T10:000:1515min100保持T20:150:5035min80边界再检查T30:501:5060min40暴力分拿满T41:503:30100min10放弃正解写暴力这张表能帮你找到最适合自己的时间分配策略。比如有的人T1需要25分钟那就把T2的时间压缩到30分钟有的人T3能拿60分那就不要花两小时去冲100分。2.4 第六周查漏补缺与心态调整最后一周不要再学新算法了重点做三件事第一把之前做错的题重新做一遍确保同样的错误不再犯。第二把常用模板默写一遍包括快速排序、二分查找、并查集、Dijkstra、01背包等。第三调整作息确保考试时间段上午8:30到12:00精神状态最好。心态方面我见过太多平时练得不错但考场崩盘的案例。核心原因是期望值管理失败。复赛四道题能拿满两道就是省一水平能拿满一道加两道暴力分就是省二水平。不要一上来就想着AK先把能拿的分稳稳拿到手。3. 四道题的得分策略从签到到压轴每分必争3.1 第一题必须拿满不许失误CSP-J2和CSP-S2的第一题通常是签到题考察基本模拟或简单数学。这道题的目标只有一个100分。如果第一题丢分后面压力会非常大。第一题的常见类型包括日期计算、进制转换、简单统计、字符串处理。这类题的坑往往不在算法而在细节。比如闰年判断、边界值、取模运算、输出格式。我建议做完第一题后至少检查三遍第一遍看样例第二遍自己造几组边界数据第三遍对照题目要求逐字检查输出格式。实操技巧对于模拟题先把题目中的规则用注释写在代码里然后逐条实现。这样不容易漏条件。比如“如果今天是周五则下周一是三天后”这种规则写清楚再写代码。3.2 第二题基础算法争取满分第二题通常考察一个明确的算法或数据结构比如贪心、二分、简单DP、栈或队列的应用。这道题的目标是80到100分。如果一眼能看出正解那就直接写如果只能想到暴力先把暴力分拿到手再想优化。以二分答案为例这类题的标志是“最大值最小”或“最小值最大”。识别出二分之后核心是写对check函数。我一般会先写一个暴力的check确保逻辑正确再考虑优化。二分边界也很关键left和right的初始值、循环条件、更新方式都要仔细。常见错误二分时mid (left right) / 2可能溢出应该写成mid left (right - left) / 2。另外如果答案是浮点数二分次数一般设100次左右就够了。3.3 第三题区分度所在暴力与正解之间第三题是拉开差距的地方。J组的第三题可能是复杂模拟或中等DPS组的第三题可能是图论或数据结构。这道题的目标是40到70分。如果正解很难想不要死磕先把暴力分拿满。暴力的写法有很多种枚举所有情况、DFS搜索、模拟过程。关键是估算时间复杂度确保在题目数据范围内能跑完。比如数据范围是n 1000那O(n^2)的暴力可以接受如果n 10^5那只能想O(n log n)的正解。我通常会让学生先写一个最朴素的暴力跑一下样例确认正确性。然后看数据范围如果暴力能过一部分测试点就先提交再想优化。优化的时候可以从暴力出发看看哪些计算重复了能不能用前缀和、记忆化、数据结构来加速。3.4 第四题能拿一分是一分第四题通常是压轴题涉及复杂DP、高级数据结构或思维题。对于大多数选手来说这道题的目标是10到30分。不要想着拿满分而是尽量拿部分分。部分分的来源包括小数据范围的暴力、特殊性质的子任务、输出样例或随机答案。我见过有选手第四题直接输出0拿了5分因为测试数据里有答案为0的点。虽然不提倡这种投机但在时间不够的情况下写一个能过小数据的暴力是性价比最高的选择。考场策略如果第四题读完题完全没思路先跳过回去检查前三题。确保前三题没有低级错误后再回来写第四题的暴力。千万不要在一道题上卡超过40分钟。4. 刷题方法为什么你做了100道题还是不会4.1 精做一道题胜过泛做十道题很多同学刷题量很大但分数不涨核心原因是只做不总结。正确的刷题流程应该是读题、思考、写代码、调试、提交、看题解、对比、重写、总结。其中“对比”和“重写”是最关键的步骤。我一般要求学生每道题做完后回答三个问题第一这道题的核心考点是什么第二我的解法和题解相比差在哪里第三如果下次遇到类似的题我能想到什么把这三个问题的答案写在题解本上定期翻看。以一道贪心题为例题解可能用了排序加优先队列而你用的是暴力枚举。对比之后你会发现贪心的关键在于“每次选择当前最优”而优先队列是用来快速找到当前最优的工具。总结下来就是贪心策略 合适的数据结构 正解。4.2 对拍自己给自己出测试数据对拍是复赛准备中最重要的调试技能之一。它的原理很简单写一个暴力程序和一个正解程序再写一个随机数据生成器然后不断运行两个程序并比较输出。如果输出不一致就找到了反例。对拍的模板大概长这样// data.cpp 生成随机数据 #include bits/stdc.h using namespace std; int main() { srand(time(0)); int n rand() % 100 1; cout n endl; for (int i 0; i n; i) { cout rand() % 1000 ; } return 0; }# 对拍脚本 while true; do ./data input.txt ./brute input.txt output1.txt ./solve input.txt output2.txt if ! diff output1.txt output2.txt; then echo Found difference! break fi done对拍能帮你发现很多手写数据发现不了的边界问题。我建议每道有把握的题都做一次对拍尤其是DP和贪心题。4.3 错题本记录的不只是答案错题本不是抄题和抄答案而是记录思维过程。我一般让学生按以下格式记录题目来源和编号我的错误思路为什么错正确思路关键突破点代码实现中的坑比如数组开小、边界写错同类题目的识别特征比如有一道题是“求区间内第k小的数”我一开始想用排序但数据范围是n 10^5排序会超时。正确思路是二分答案加前缀和。记录下来的识别特征是看到“第k小”和“区间查询”优先考虑二分答案。5. 考场上的那些坑从文件名到时间分配5.1 文件输入输出每年都有人在这里爆零CSP复赛要求使用文件输入输出文件名由题目指定。常见错误包括文件名拼写错误、大小写不一致、忘记加.in或.out后缀、文件放在错误的目录下。我建议在考试开始后先建好四道题的文件夹每个文件夹里放好模板代码文件名直接复制题目要求。注意有些考场使用的是NOI Linux系统文件路径和Windows不同。考前一定要熟悉考场环境如果允许提前试机务必把文件操作练一遍。5.2 时间分配三个半小时怎么用以J组为例我推荐的时间分配是T1用20分钟T2用40分钟T3用60分钟T4用60分钟剩下30分钟检查和补暴力。S组因为难度更高T1用25分钟T2用45分钟T3用70分钟T4用50分钟剩下20分钟检查。当然这只是参考实际要根据题目难度调整。核心原则是先拿稳分再冲难题。如果T1卡住了不要慌先跳过做T2回头再想T1。有时候换个脑子反而能想通。5.3 代码风格写得清楚比写得快更重要考场上代码是写给自己看的但清晰的代码能帮你快速定位错误。我建议变量名用有意义的英文比如maxScore而不是a关键步骤写注释函数功能单一避免过长的嵌套。调试的时候可以在关键位置输出中间变量但提交前一定要删掉或注释掉。常见错误调试输出忘记删除导致输出格式错误。我一般会在代码开头定义一个DEBUG宏调试时打开提交时关闭。6. 常见问题速查与避坑指南6.1 为什么我的代码样例过了但提交WA这是最常见的问题。原因通常有三类第一边界条件没考虑比如n0或n1的情况第二数据类型溢出比如int存不下10^10第三多组数据没有清空全局变量。解决方法是对拍用随机数据找出反例。6.2 动态规划的状态转移方程怎么推DP是很多人的痛点。我的经验是先写暴力搜索然后观察搜索树中哪些状态重复计算了把重复的状态用数组存起来就得到了DP。状态定义要明确“dp[i]表示什么”转移方程要覆盖所有情况。如果推不出来先写记忆化搜索再改成递推。6.3 图论题建图建不对怎么办图论题的第一步是确定图的类型有向图还是无向图带权还是无权然后选择合适的存储方式邻接矩阵适合稠密图邻接表适合稀疏图。建图之后先跑一遍最短路或DFS确认图连通性。如果建图错了后面全错。6.4 考试时紧张到手抖怎么办这是心理问题但可以通过模拟训练缓解。我建议考前至少做五次全真模拟包括时间、环境、提交方式。模拟多了考场就变成了一次普通的练习。另外考试当天早上不要吃太饱带一块巧克力补充能量。问题可能原因解决方法样例过提交WA边界、溢出、多组数据对拍、检查数据范围DP推不出来状态定义不清先写暴力搜索再优化图论建图错误图类型判断错先画图再写代码时间不够分配不合理模拟训练固定时间文件操作错误不熟悉考场环境考前试机练习7. 最后几周我建议你这样调整状态到了考前最后几天不要再刷新题了。把之前做过的题拿出来尤其是错题本上的题重新做一遍。确保每道题的思路和代码都能独立完成。同时把常用模板默写几遍做到不看书也能写出来。考试前一天去考场踩点确认交通和座位。晚上早点睡不要熬夜。考试当天提前半小时到考场带好准考证和文具。进入考场后先深呼吸几次然后按平时模拟的节奏开始。我在带学生的过程中发现那些最终拿到省一的选手往往不是最聪明的而是准备最有条理的。他们知道自己每一步该做什么遇到问题知道怎么排查时间不够知道怎么取舍。这种能力不是天赋而是通过科学训练获得的。如果你现在距离复赛还有六周那就按上面的时间表一步步来。如果你只剩两周那就重点抓T1和T2确保这两题拿满T3和T4写暴力。如果你只剩一周那就把近三年真题做一遍熟悉题型和时间分配。复赛不是拼谁会的算法多而是拼谁能在考场上把会的东西稳定发挥出来。把能拿的分拿到手你就已经超过大多数人了。