这些年,后台经常有人问我:“acm icpc 到底值不值得参加?”每次看到这个问题,我都不会马上回答“值”或者“不值”,因为这件事很像健身:有人练出了力量,有人练出了自律,也有人练伤了膝盖然后发誓再也不进健身房,acm icpc 本身不是答案,它只是一个强度很高的场景,你在里面怎么练、跟谁练、练完怎么复盘,才决定它最后变成什么。
先说个我身边的真实例子,两年前,一个学弟小周找我聊天,说他大一刚进实验室时特别兴奋,看到学长们在白板上写图论、动态规划,觉得“这就是大学该有的样子”,结果第一次队内周赛,他们队三小时只做出一道签到题,小周负责的题读了四十分钟,题意理解偏了,代码写到一半发现方向错了;另外两个队友同时卡在一道模拟题上,三个人围着屏幕改来改去,最后连样例都没过,回宿舍路上,他跟我说:“我是不是不适合这个?”我当时没安慰他“你只是没发挥好”,而是问了他一句:“你们赛后复盘了吗?”他愣住,说没有,太沮丧了,直接回去打游戏了。
这就是很多 acm icpc 新人的第一个坑:把比赛结果当成能力判决书,却忽略了比赛本身是一个诊断工具,后来小周他们改了训练方式,每周固定一次模拟赛,赛后不急着看榜,而是先让每个人讲:这题当时为什么没读出来?是知识缺口,还是策略失误?是代码能力不够,还是沟通出了问题?他们甚至规定,比赛时一个人主写,一个人读题并整理题意,一个人负责构造反例和查边界,到了第二年省赛,他们没拿金牌,只拿了个铜,但小周跟我说,那是他第一次觉得“我们不是三个各写各的人,而是一支队伍”。
这件事对我影响挺大,因为很多自媒体写 acm icpc,喜欢把它写成“大神养成记”:凌晨两点的实验室、满墙的算法模板、奖牌和保研,听起来很燃,但只写这些,会误导一部分本来适合慢慢成长的人,acm icpc 真正的门槛,不只是智商,也不只是刷题量,而是你能不能接受自己长期处在“不会”的状态里,今天不会网络流,明天不会构造,后天发现队友比你强很多,大后天又发现强队十分钟过题而你连题意都没看懂,这个过程非常磨人,它不像考试,有明确范围;它更像给你一张地图,然后告诉你前面有片森林,自己找路。
我还有一个朋友林然,大学时打过两年 acm icpc,最好成绩只是区域赛铜牌,毕业面试时,面试官问了一个资源调度问题,没有标准算法模板,更多是业务约束,林然说,他当时没有立刻背题,而是下意识地先问:任务规模多大?有没有优先级?能不能抢占?边界条件是什么?他说这些习惯,就是当年比赛里被逼出来的,因为 acm icpc 的题往往不会直接告诉你“用什么算法”,你得从一段故事化的描述里拆出模型,这个能力放到工作里特别值钱:产品经理说“我想要一个推荐”,你不能马上写代码,你得先问清楚目标、数据、约束和评估方式,acm icpc 没教他具体业务,但教了他别急着动手,先把问题定义清楚。
我也不想把 acm icpc 神化,我的个人观点很明确:它值得参加,但不值得所有人都用同一种方式参加,如果你本身对算法、逻辑、工程实现有好奇心,愿意长期训练,那么它会给你的东西远超奖牌:你会学会团队协作,学会在压力下做取舍,学会写测试、查边界、复盘失败,也会认识一批非常聪明的同龄人,但如果你只是为了简历上多一行字,或者被“别人都在打”裹挟着进去,那大概率会痛苦,尤其是那种只刷题不复盘、只追求题量不看质量、把队友当竞争对手而不是合作者的训练方式,很容易把人耗空,比赛可以热爱,但没必要用健康和生活去换,凌晨两点改代码不一定是浪漫,有时候只是白天效率不高的代价。
如果让我给准备入坑的人一个建议,我会说:先别急着定“我要拿金牌”的目标,先定三个更朴素的目标,第一,连续参加十场模拟赛,每场都写复盘;第二,建立自己的算法模板库,但模板要能讲清楚为什么这么写;第三,找到两个愿意沟通、愿意轮流承担脏活累活的队友,奖牌是结果,不是起点,你真正能带走的,是遇到陌生问题时那套拆解流程,是被卡住后还能冷静打印代码、构造样例、重新读题的能力,是队友之间一句“这题我来,你先看另一道”的默契。
所以回到开头那个问题:acm icpc 值不值得?我的答案是,值不值得不取决于比赛,而取决于你把它当成什么,如果把它当成一场只认结果的排名赛,它会很残酷;如果把它当成一次高强度的解决问题训练,它会很珍贵,它不一定让你成为大神,但它很可能让你变成一个更会学习、更会合作、也更能在复杂问题面前不慌的人,对我这种写内容的人来说,这比一块奖牌更有故事;对正在经历它的人来说,这比一句“加油”更实在。
