
作为刚入学就一头扎进新生赛的过来人我打算把这段参赛经历完完整整记下来。标题写了【自述更新中】一是因为这文章本来就是一版一版改出来的二来比赛前后心态和认知变化太大回头看上一次写的东西经常觉得自己当时太天真。新生赛在很多学校就是一场给新生的算法竞赛也叫校赛、热身赛内容从排排坐写AB到需要一点脑筋的规律题再到看着就像是给大佬准备的压轴题什么层次都有。这篇自述我不打算写成一篇标准的攻略而是把我从报名、备赛、比赛当天到赛后复盘的全过程包括踩过的坑、想不明白的题、心态崩了又捡起来的瞬间都摊开来讲。对零基础想打比赛的人这篇内容应该能让你少走很多弯路对已经准备参赛的你可以直接抄我复盘时总结的那套方法和避坑清单。1. 新生赛到底比什么1.1 赛事定位一场给新人的算法体验课很多人一听“新生赛”就紧张以为这是要跟各路大佬拼个你死我活。实际参加过就明白新生赛最核心的定位不是选拔而是体验。学长学姐办这场比赛很大程度上是想告诉刚进校的同学编程不是只在课本上背语法它还可以是一场限时解题的游戏而且这场游戏有明确的规则、有即时反馈、有排名压力玩起来非常上瘾。以我们学校的情况来说新生赛通常安排在开学后第六到第八周报名人数往往超过三百人其中很大一部分在报名时连map和set都没用过甚至有人只写过程序设计的课后作业。比赛语言以C/C为主也有少数用Java或Python但数量很少。赛制四小时十道题按通过题数和罚时排名。这里说的罚时就是每道题从比赛开始到第一次正确提交之间经过的时间加上错误提交额外增加的惩罚时间通常是20分钟。也就是说你不仅要做得对还要做得快而且不能乱交、反复交。那它到底在考什么我个人的体会是新生赛考的更多是“在有限时间内用你现有的知识解决问题”的能力而知识本身的门槛其实非常低。大部分题都是基础模拟、简单枚举、二分查找、前缀和、贪心、简单DP这一类。说白了真正的难点并不在算法有多高深而在你能不能读懂题、能不能把思路转化成代码、能不能在debug时保持冷静。这三件事恰好是大学四年乃至以后工作里最核心的编程素养。1.2 题目结构从签到题到压轴题的难度梯度新生赛的十道题难度分布是有套路的。正常情况是题目类型数量难度典型考点签到题2-3道极低输入输出、简单运算、字符串处理基础题3-4道中等排序、模拟、二分、贪心进阶题2-3道较高前缀和、DP入门、搜索、并查集压轴题1-2道很高数学构造、复杂图论、状态压缩“签到题”这个名字很形象就是让你来了、坐下、签到拿一血建立信心的题目。比如第一题经常是“给你两个数输出它们的和”或者“给你一串字符串倒着输出”。这种题考察的不是智商而是你的环境有没有配好、提交流程走没走通。如果你连签到题都WA了好几次大概率不是脑子的问题而是读入输出格式、数组越界这类低级问题。中段的题开始出现区分度常见套路是模拟题和二分题。模拟题会给你一段文字描述的场景比如模拟一个排队过程、一个日历系统、一个打分规则你得把过程用代码走一遍。这类题最坑的是边界条件多容易漏情况。二分题则偏思维重点不在代码而在“能不能想到答案具有单调性可以用二分去逼近”。进阶题已经接近正式的算法题了像前缀和用来快速求区间和简单DP用来求最短路径数、背包问题之类DFS/BFS则是搜索题的基石。到压轴题往往就不是“会不会算法”的问题而是“能不能数感爆棚发现规律”的问题很多数学构造题代码只有三五行但思路就是想不出来。我在备赛时把这些层次摸清楚以后才明白一个道理新生赛的成绩并不取决于你临时学了多少高深算法而取决于你能否把基础题稳稳拿满、进阶题尽量抢分。目标定得太高容易摔得很惨。2. 报名与备赛我踩过的第一个坑是人多2.1 报名时最容易忽略的几件事新生赛报名看起来简单——填个表、加个群、完事儿。但这里面的坑比想象中多。第一个坑是“我以为报名了就有比赛场地”。我们学校赛前三天才在群里发公告说今年因为机房设备问题线上赛改到指定教室而且是每三十人一个大教室间隔坐人。结果很多同学没看群消息当天跑错了地方折腾半个多小时。所以报名以后第一件事不是买书不是刷题而是把比赛群置顶把群公告从头到尾读三遍甚至主动去问学长学姐“赛前还会不会变”。别嫌麻烦一次变动就可能让你开赛前心态乱掉。第二个坑是环境准备。有些同学平时用Visual Studio写代码写得挺爽但OJ在线判题系统不吃这一套。比赛用的是Linux环境下的GCC编译跟Windows下的VS有一些差异比如scanf/printf和cin/cout混用的坑、long long在Windows和Linux下的大小差异、头文件要不要写cstdio这些细枝末节。建议提前两周就用OJ的在线IDE或者本地装一个MinGW环境照着比赛的编译选项配置好。我在备赛时就吃过一次亏本地用Dev-C跑得好好的代码一交上去直接编译错误原因是没有包含map头文件本地编译器自动帮我补了依赖OJ不会。第三个坑是队友或单人问题。新生赛有些学校是单人赛有些是三人组队赛。大家报名时会默认找室友、找同班同学凑队但很少考虑“性格适配”。组队赛最忌讳两件事一个是不说话各做各的另一个是抢键盘谁都不服谁。我见过一个宿舍三兄弟组队比赛前说好怎么分工结果一开赛全都扑向最简单的签到题抢了五分钟键盘最后三个人挤在一个代码里改了又改。后来我们队定了清晰的规矩签到阶段一人写代码其他人读后面的题遇到卡题每人单独思考十分钟再集中讨论。这个规范看着简单保住了我们后两个小时的心态。2.2 零基础到新手需要的三块敲门砖如果你现在刚学完C语言的循环和数组离能去新生赛打一场至少还差三块敲门砖。第一块是STL。C的STL就像编程世界的工具箱vector是能自动扩容的数组map是键值对字典set是自动去重和排序的集合sort是随手可用的排序函数queue和stack分别是队列和栈。没有STL你用数组手写这些结构的代码量是STL版本的三到五倍还极其容易写错下标。新生赛里大量题目不需要你实现结构本身只需要你会“调用”它们。所以零基础选手优先学STL性价比极高。第二块是读题能力。这句话听起来像废话但我在赛后复盘时发现十道题里我有两道是“读题不仔细”翻车的。一道题要求输出结果保留两位小数我看漏了直接用整数输出WA了三次还有一道题说数据保证没有重复我却写了一大段去重逻辑白白浪费时间。新生赛的题面普遍喜欢把关键条件藏在中间段落甚至最后一句你跳着读就中招。后来我给自己定了个规矩任何题目必须读三遍第一遍通读第二遍把输入输出格式、数据范围、特殊条件画出来第三遍在草稿纸上用自己的话复述一遍题目确认理解无误再动手。第三块是debug能力。新手写代码最大的问题不是不会写而是出了问题不会查。最常见的报错类型有编译错误少括号、缺分号、类型写错、运行错误数组越界、除零、答案错误逻辑不对、边界漏判。我自己的Debug流程是先从报错信息定位问题所在行再看数据范围检查有没有超过int的变量能用long long就尽量用然后构造几组极端数据比如空数组、只有一个元素、最大值、最小值、重复值一步步缩小出错范围。掌握这套流程以后WA从“抓狂半小时”变成了“五分钟内定位”节省下来的时间比多学一个算法更有价值。2.3 我的备赛节奏三周高强度加一周稳住状态我的备赛周期满打满算四周前两周半是“广撒网”后一周半是“稳状态”。第一个阶段跟网上的公开课程和刷题网站走。我选的是洛谷和Codeforces。洛谷的题库有题目难度标签特别适合新手按图索骥Codeforces则主要是用来模拟比赛节奏它的题目区分度很好哪怕只做出A题也能锻炼赛场心态。每天我保证两到三题的刷题量不是数量上的刷而是每道题都写成完整代码并在OJ上通过。这里说个经验之谈只读题不写代码等于没学。很多题目你觉得“思路很简单”一写代码就各种报错这就是典型的眼高手低。第二个阶段是专项突破。我在第一周扫了一遍自己容易出错的题型发现自己排序、二分、简单贪心都能做但一到递归和搜索就发怵。于是花了两天时间集中看DFS和BFS用模板题反复练直到能默写核心框架。参加新生赛不需要面面俱到但要确保基础题型里没有明显的短板因为比赛是木桶效应一道题卡住四十分钟比你放弃它去做别的更影响心态。第三个阶段是模拟赛。比赛前十天我做了一次完整的线上模拟直接在Codeforces找一场难度合适的老人家新手赛按正式赛的四个小时来计时。第一次模拟我只做出两道题而且第二题提交了七次才过罚时惨不忍睹。第二次模拟已经能稳定做出四道并且学会了在卡题二十分钟后跳题。这两场模拟赛的价值远远大于我之前两周的零散刷题因为它暴露出来的问题全是赛场上的致命伤时间分配不合理、被罚时拖累、心态崩掉以后乱提交。3. 比赛日现场实录做题顺序与心态崩了怎么办3.1 开场40分钟先拿签到题再定策略比赛当天早上我提前四十分钟到了机房从带的东西就能看出一个选手的成熟度身份证、准考证、黑色水笔、三张草稿纸、一瓶水还有提前打印好的STL常用函数速查表。很多人觉得比赛台上不能看资料其实规则只禁止联网和讨论自己的笔记完全可以带。我带速查表的目的不是为临时查而是为了让自己心里有底万一某个STL函数记不清参数可以瞟一眼省的因为这种小事浪费提交次数。开赛前五分钟我给自己定的策略只有一句话前四十分钟只做前三道能确定拿下的签到题和基础题把所有题目扫一遍。九点比赛正式开始我先花两分钟把十道题全部看了一遍在草稿纸上给每道题标注了预估难度和自己的信心级别。这个过程非常重要因为有些题目看起来题目很长很吓人数据范围却很小直接暴力就能过有些题目题干只有五行却是整场比赛的最大陷阱。开场十五分钟我顺利提交了第一题和第二题一血到手排名一度冲进前十。这时候最容易飘好在我提醒自己前两道题是所有人的“保底题”后面才是真正的比赛。第三道模拟题我开始认真对待读了三遍题确定了所有边界条件花了大约二十分钟写代码和测试。提交时心里还有些不确定幸好一次通过。三题到手时间还剩三个小时我给自己倒了一杯水站起来稍微活动了一下重新浏览剩下的题目。3.2 中段推进三小时里我试过的路线第四题到第七题才是真正的分水岭很多人在这个阶段开始出现“明明有思路却写不对”的烦躁感我也不例外。第六题是一道二分题X轴上有许多点要在指定位置装信号塔要求覆盖所有点的最小半径。这种题我在备赛时练过类似的按理说稳拿。但问题出在我对精度的处理上题目要求输出结果保留一位小数我用了整数二分结果最后一组数据死活差0.1。我在那题上卡了二十分钟挣扎着想用浮点二分又怕超时。这时候我做了整场比赛最正确的决定之一把第六题先放一放去看第七题。第七题是一道前缀和的裸题求一个数组里所有长度为K的子数组的最大和。看到数据范围是十万级别我马上就想到滑动窗口或者前缀和三分钟理清思路十分钟写完代码并测试了几组数据提交一次通过。这道题给我的信心极大反弹第六题卡住的焦虑消了大半。我再杀回去用浮点二分重写把epsilon设成1e-7提交也通过了。两题到手排名又往前挪了不少。我的体会是赛场上最忌讳的并不是“不会做”而是“困在一道题上”。连续四十分钟做不出有效进展就应该立刻换题。换题不是放弃而是把赛场上最廉价的资源——时间分配到更有可能产生收益的题目上。我的节奏大概是每道题最多投入三十分钟三十分钟内必须有实质推进写出了完整代码、或者想清楚了关键算法否则先跳回来再说。3.3 卡题时刻放弃也是一种策略第八题是我这场比赛里比较狼狈的一道一道搜索题要在迷宫里数连通块。按我备赛的水平这题应该能做出来但我当时刚写完第七题思路还在二分上切换到DFS的思维花了很长时间。更糟糕的是我在写bool数组标记访问时把行列坐标写反了导致死循环直接运行超时。这时候离比赛结束还剩五十分钟排名卡在中游。我深吸一口气把第八题的代码全部推翻重新在草稿纸上画了一遍迷宫图。我突然意识到这不是死循环的问题而是我的DFS剪枝条件从一开始就错了题目里允许斜向移动意味着我从一个格子出发有八个方向而不是四个。改掉这个条件后代码逻辑通了提交后一次通过。虽然这道题花的时间比我预想的多但最终做出来的成就感也最强。第九题是一道组合计数的数学题我看了一眼就判断自己大概率做不出来。按正式赛的惯例比赛结束前二十分钟我会停止尝试新题专心检查前面几题的提交情况。确认所有代码都没有低级错误后我试着给第九题写了一个暴力搜索看能不能在数据范围较小的情况下骗到部分分可惜结果超时只收到一个WA但我并不后悔。比赛的分数是“你通过了多少题”而不是“你尝试了多少题”能拿到的分先拿到拿不到的分别硬耗这是新生赛给我上的第一课。4. 因为一道题我把整场比赛复盘了三遍4.1 赛后第一件事不是查排名是看提交记录比赛结束的那一刻我做的第一件事不是打开实时排名而是把网页切到自己的提交记录一题一题地看每道题目的提交时间和结果。这个习惯来源于我备赛时养成的“错题档案”意识只是当时记录在笔记本上这次记录在脑子里。我发现了几个问题第一题我虽然一次通过但在通过之前犯了一个非常低级的错误——读入时把%d写成了%s编译直接报了warning我在本地没注意第一次提交直接编译错误。这种错误如果发生在比赛后段很可能会让我心态崩掉。第二点我的罚时其实不低第七题虽然在规定时间做出来了但我因为不放心反复提交了好几次相同逻辑的代码白白加了好几次罚时。这提醒我提交前应该再花三十秒冷静检查而不是抱着“碰碰运气”的心态。我开始把整场比赛按时间轴重新在草稿纸上画出来标出每道题投入的时间段、提交状态、出错原因。这个过程看起来琐碎却让我对比赛的全貌有了把握我的得分基本来自签到题和前段的基础题中后段能力不足的问题被“题目顺序相对友好”掩盖了。如果换一套乱序题我大概率会扑街。4.2 复盘模板每道题都要回答的四个问题赛后复盘我没有停留在“哇那题好难”的情绪里而是建了一个表格把十道题都填了进去。表格的列分别是题目编号、我的思路、正确的做法、差距在哪里、下次怎么办。这个模板看起来简单但非常有效。以第一题的编译错误为例“我的思路”是不存在的纯粹是手误“正确做法”是读入和输出都用标准的scanf/printf不要在类型上犯迷糊“差距在哪里”是我没有形成提交前自检清单于是“下次怎么办”明确记录提交前检查三件事——头文件是否完整、变量类型是否匹配、数组大小是否越界可能。第二道题是排序结构体我WA了一次原因是排序函数没写清楚结构体的比较条件是“分数不同按分数排分数相同按学号排”我在cmp里只比较了分数。这道题的复盘让我养成了一个习惯任何自定义排序函数写完先拿两组包含边界条件的样例测试而不是直接交。每一道题的复盘都指向一个具体可执行的改进动作。等到十道题全部复盘完毕我发现新生赛教会我的并不是多少算法知识而是一套自我纠错的方法论。这套方法论在后面的课程设计、面试刷题甚至代码调试中一直有用。4.3 新生赛教会我的三件小事第一件事是承认自己“暂时不会”并不丢人。复盘的表格里第八、第九、第十题我都标着“未想出”但正因为承认了不会我才能在赛后几天有针对性地补搜索和组合数学。如果死要面子假装题目没意思那这场赛就白打了。第二件事是比赛是学习的加速器。平时我学一个算法可能拖一个星期但为了准备新生赛我两天内学完了DFS和BFS三天内刷了二十道二分题。比赛给你一个明确的时间节点你的效率会指数级提升。不要等到觉得“自己准备好了”再参赛因为人类永远不可能准备好比赛的意义就在于“在限定时间里用现有水平全力以赴”。第三件事是排名不是最重要的路线才是。我见过比赛成绩中等、但赛后一周内把复盘里所有“不会”的题都AC掉的同学他的成长速度远远快于那些排名靠前、但打完就丢下比赛的人。所以我会劝下一届的新生赛前好好准备赛中尽力发挥赛后勤快复盘这条流程走完输赢都已经不重要了。5. 给下一届新生的建议现在就可以开始做的事5.1 开学第一周就做这几件事如果你明年想参加新生赛不用等到报名开始才行动开学第一周就能做很多事情。第一装好环境。在自己电脑上搭好一个能写C、能编译运行的环境不需要装太多花哨的东西一个编译器加一个顺手编辑器就够。我推荐新手从Dev-C开始因为它开箱即用装完就能写代码等练习量上来再换VS Code或CLion都行。关键是别在环境上浪费太多时间环境只是工具核心是刷题量。第二找个刷题平台注册账号。洛谷、牛客、Codeforces三选一即可注册完先把“新手村”或“入门题单”刷完。那个过程可能会很挫败因为你会发现自己连输入格式都读不懂但没关系这是所有人的必经阶段。我当时第一次在洛谷交题因为输出多了个空格WA了五次气得想砸键盘但正是那五次WA教会了我认真对待输出格式。第三找到组织。去贴吧、QQ群、社团招新或者直接问学长学姐把你们学校ACM集训队或者编程社团的联系方式加上。新生赛前这些组织一般会组织培训哪怕只是线上的直播讲题也比你自己闭门造车效率高得多。更重要的是你会认识一群同样在准备新生赛的朋友大家可以一起刷题、互相吐槽WA的原因不至于一个人扛不过前期挫折。5.2 把比赛当考试考试当比赛这句话是我在备赛第二周悟出来的。很多人平时写代码很随意变量名随便起、中间过程不打印、出了问题全靠猜但到赛场上突然变得极度紧张连代码都敲不利索。这种割裂感会让你平时的水平完全发挥不出来。我练了三个“平时要求”第一所有刷题都计时。哪怕是简单题也要记录自己从读题到提交花了多久目标是把简单题压在十五分钟内拿下才能给后面的硬骨头留出缓冲。第二以AC为唯一标准不以“感觉差不多”为标准。平时写完代码要在OJ上提交并通过才算结束不能只在自己电脑上运行几个样例就草草了事。第三尝试在有点饿、有点困的状态下做题。这不是自虐而是模拟比赛的实际状态——比赛那天你会紧张、焦虑状态远不如平时清醒提前适应一下赛场上反而能保持冷静。反过来比赛前一周可以把以往的高考题、模拟题安排得像考试一样来做提前到场地、只看纸质题单、不聊天不查资料、严格计时。我在这次新生赛前十天做的那两场模拟赛就是把Codeforces当模拟卷收获巨大。5.3 更新中的“新生赛”心态比赛只是起点这篇自述写到这已经很长了但我的新生赛故事还远没结束。赛后我把自己的复盘文档放到博客上陆陆续续收到很多同届和学弟学妹的消息有人问我某道题的解有人分享他自己的备赛计划还有人问“学长我零基础现在开始学还来得及吗”。我的回答永远是来得及种一棵树最好的时间是十年前其次是现在。我现在已经不再为比赛当天的排名焦虑反而开始享受赛后总结、被提问、帮别人答疑的过程。新生赛让我养成的“限时解题”的训练方式我打算一直练下去一直更新下去。以后等我打完更多的赛事回头再看这篇文章大概又会嫌自己幼稚。但如果这篇自述能让后来者少踩几个坑在赛场上多一分从容那这洋洋洒洒的几千字就没白写。最后再分享一个小技巧比赛结束后把复盘文档存成一份“写给明年自己的信”放在你明年的日历上。等到你再次翻开的时候会发现自己过去一年走了多么远的路。这份自述也在更新中下一次更新就是明年的新生赛现场。