跳转至

ICPC / 算法竞赛

ICPC/CCPC 是大学阶段认可度很高、训练强度也很高的一类算法竞赛。阅读之前,可以先把本文理解为一次建立预期的入口:也许你会理解这条路能带来什么、需要付出什么,以及它为什么既迷人又残酷。

写在前面

下面是 刘博文(AKA 辽宁算法皇帝) 的分享。原文写得很短,因为他认为 ICPC/CCPC 这种东西不太需要在这里展开成百科式介绍:真正感兴趣的人,自然会去查规则、刷题、打校赛、进集训队;如果一个人完全没有行动意愿,学长再把路线图写得多细,也很难真正把他带进这条路里。

由于笔者就是被他鄙夷的没有任何算法基础的同学,所以这个“写在前面”,我也无法告诉你 ICPC 应该怎么学。辽宁算法皇帝当然知道,但他比较傲慢(所以学妹不要找他打比赛做科研)。我部分认同他的观点,但还是希望在正式阅读下面这篇分享之前,先给没有接触过算法竞赛的同学补一点基本语境。

ICPC/CCPC 是一个很纯粹的比赛。它不需要作品包装,不需要 PPT、商业计划书、课题组资源或者祖传项目(在这么复杂的时代还有这么纯粹的比赛是多么的宝贵)。比赛现场就是三个人、一台电脑、五个小时、若干道题。你需要读懂题意,抽象问题,设计正确且足够高效的算法,再把它写成没有 bug 的代码并通过评测。

算法竞赛对计算机基本功的锻炼非常扎实。我认为(错了勿喷) ICPC/CCPC 最核心训练的东西就是两件事:数学能力手撕代码的能力。前者决定你能不能把题目抽象成可以处理的形式,后者决定你能不能在高压、限时、无联网的环境里把想法稳定落成程序。这两项能力都很基础,也都很重要。

不管对于就业和升学,这无疑都是会在面试阶段让你取得很大优势的能力。

但对于科研呢?放到现在 AI 相关方向里看,算法竞赛积累的能力可能会特别适合某些更偏系统和工程的方向,比如 AI Infra、Efficiency、推理加速、算子优化等。

可如果进入的是另一类 AI 研究,比如更偏实验科学的问题(大部分 AI 方向都是实验科学),算法竞赛积累的能力是否还能同样高效地转化?

所以阅读下面这篇分享时,可以不急着问“我现在该从哪本书开始学”。更重要的问题也许是:你是否真的享受数学抽象和手写代码本身?你是否愿意长期面对负反馈和失败?你未来想走的方向,是否需要这种高强度算法训练带来的能力?如果这些问题的答案是肯定的,ICPC/CCPC 可能会成为大学里非常值得投入的一条路。

分享者一:辽宁算法皇帝

算法竞赛 就是 竞赛皇帝

算法竞赛,泛指 ICPC(世界范围)、CCPC(中国范围) 以及一些认可度较低但是对选手要求类似的水赛,比如已经被爆了的蓝桥杯,最近还比较有认可度的百度之星、天梯赛等。如果你打算法竞赛的话,建议以 ICPC/CCPC 级别的比赛为目标,后文默认以这两个比赛为主语来介绍算法竞赛的一些内容。

简单来说,我们是一个 “设计算法解决数学问题” 的竞赛,我们的竞赛非常严格,要求选手全程手写代码,一般都禁止联网,但是可以参考纸质资料,每队三人协作。整个比赛你需要在机房线下断网五个小时,全程高压环境下解决若干道难度不一的题目,期间你可以参考纸质资料。主办方会提供午餐,~~所以你可以吃掉队友的午餐~~。

参与 ICPC/CCPC 、甚至一些路边算法比赛 你可以获得什么:

  • 最扎实的计算机/算法功底:靠自己能力拿到过 ICPC/CCPC 奖牌的同学和其余没有类似水平的同学在算法基本功上有质的差别,这种差距基本不是靠自己学习或者校内课程可以弥补的。

  • 广泛的认可度:算法竞赛可以说是认可度最高的竞赛,而且很多高校(浙江大学、清华、北大、上交、复旦、南大、中科大、人大、北航、大连理工等)在研究生保送的过程中都会关注学生的算法能力,以及会有类似算法竞赛的机考来测试学生的水平(如果你有 ICPC/CCPC 区域赛铜牌以上的水平,这种考试你基本不需要提前准备,因为你的水平远超平均学生),大厂同理。

  • 快乐的大学生活:算法竞赛的圈子内很欢乐,大家有很多有趣的探讨问题的方式,包括平时交流也很友善。如果你有幸成为校队主力,你将有机会全年去国内各种地方参与比赛(~~公费旅游~~),忙一点的时候甚至一个月所有周末都不在学校,按往年规律后面你有可能前往的城市包括,南京、上海、杭州、昆明、沈阳、北京、南昌、西安、郑州、重庆、成都等(以上都是笔者本科两年内走过的城市)。

  • 丰富的机会:此外,你有可能通过算法竞赛遇到同样有志于技术的同好同学、给你深刻指导的学长、以及报酬不菲的实习机会(dlut本科 收入2500+/day & 某知名厂人才计划 LLM 方向实习,这是真的)等。总之算法竞赛会给你很多不一样的机会。

  • 其他的一些东西:抗挫折能力,高压下完成任务的能力,对自己更深刻的认知,一堆很好的朋友,或许还能找到对象,以及算法竞赛的思维真的会帮助你快速学习绝大部分计算机类课程。

我就是区

算法竞赛的 bar 超级高,比如和你竞争的相当一部分同学高中就有信息学竞赛并报送至华五以上高校的经历,弱一点的可能进过本省的省队,但是金牌就那么几块,你必须打败他们之中的几个才有冲击的机会。

你会接触到很多从小到大被看做天才的同学,然后被轻描淡写地击败。但是没关系,如果你感受到了类似这样的经历,也就说明你可能已经隐约看到这条路的尽头了。

算法竞赛十分吃天赋,数学、代码天赋高的同学如鱼得水,大约半年一年学习时间就能很快看到结果;针对天赋普通的同学,笔者认为零基础从入门到拿到 ICPC/CCPC 区域赛奖牌乐观估计需要 ALL IN 一年到一年半。这里 ALL IN 指的是使用专业课和休息之外的绝大部分时间投入,没有学生工作,没有文体活动,没有其他竞赛和科研,每周一半以上的日子都坚持训练。

ICPC/CCPC 是团体比赛,找到合适的队友也很麻烦,这东西是需要有化学反应的,以及队伍内部的磨合更是需要一两个月到半年的时间。如果你有幸遇到两个愿意陪你每天训练并走到最后的好兄弟实际上是很幸运的事情。当然很多时候是事与愿违的,大家都会遇到别的事情要做,比如实习、科研、卷绩点、卷国奖、谈恋爱甚至是打游戏。

曲折而漫长的人生里,很多时候合适的人分开或许是必然的事情,没有什么可遗憾的,大家互相祝福,然后擦肩而过。很多年后我们释然并把它归咎于类似宿命的东西,想起时心里还是会隐约痛一下,但见了面相视一笑也就过去了。

笔者大约学了五年算法竞赛相关的内容,担任过大连理工的集训队队长,拿了不少奖牌。一路走来最大的感受就是,我是普通人。

如果你仍然感兴趣

欢迎加入大连理工大学ACM算法竞赛集训队,这里是整个 DLUT 最适合学生参与算法竞赛的地方(可能也是唯一的地方)。

自学/提前了解 可以参考 oiwiki / codeforces / atcoder / newcoder / acwing 等网站,也可以问 gpt ,其实可以提供的开源资料很多,关键在于是否愿意学。

集训队每学期都会举办程序设计校赛,校赛本质上就是后续比赛的选拔赛,我们也会在每年秋季学期开放新生赛来选拔水平较高的同学。如果需要后续咨询,可以联系老学长,或者关注创院军训之后的招新加入对应新生群。