如果完全没有接触过编程
尽快学完 C 语言语法,指针、宏定义之类可以不用深究,阅读代码时能看懂即可。
然后学 c++ 常用 stl,例如 vector set map 和 algorithm 库的常用函数,不用全部记忆,写题时遇到不认识的查一下含义和用法,慢慢积累即可。
然后开始写一些水题,例如我校 OJ 上的程序设计实训等,熟悉以上两个部分内容。(这个题单可能也有一些难度较高的题,但有大量充足只需要语法知识的水题,可以根据自己的能力做,主要是为了熟悉语法和准备基本的 coding 能力。)
尽量在大一第一个学期,放寒假之前解决上述的语法基础,以及二分 dfs bfs这种入门算法。
如果有编程语法基础但没有竞赛基础
目前入门算法竞赛比较主流的网课是牛客的算法入门班 acwing的算法基础课。
看课程的同时一定要关注代码实现,一些基础的算法思路不难理解,但拿到题容易无从下手。
题目的方面可以做一做牛客/acwing上与课程配套的题目,或者洛谷的入门题单。
掌握基础的二分 dfs bfs 动态规划等等后,大概在大一寒假,可以开始打一些在线的比赛。主流网站是codeforces和atcoder。
这个时候会有一些“学的算法用不上,题还是不会写”的感觉。因为这两个网站的题目很偏思维性,很多题目可能没有特定的算法。我个人认为仅靠大二上学期结束时专业必修课课内学习的算法知识,加上足够好的 coding 实现能力和思维能力,可以在 codeforces 上达到至少1600分。
目前达到区域赛铜牌甚至部分场次的银牌,可能不需要很高深的算法,而是思维能力和简单题的手速非常重要。打完一定要补题。刚开始可能cf div2只能做一两题,atcoder abc只能写三题,但题一定要尽力补,遇到没见过的算法可以学一学,至少比赛时尝试开过的题要补。
同时算法还要继续学。我当时跟的是牛客的算法入门班,到大一暑假结束它涉及的算法基本学完了。课后习题不会做很正常,视频里讲过的尽量写出来。如果能掌握入门班的算法+足够好的思维题能力应该可以在区域赛拿到银牌。
学新算法时也可以看看洛谷的“能力全面提升综合题单”中对应的专题,专题分类和题解都比较详细,对学习一个新算法过程中从“理解算法思路”到“了解如何在最初级的模板题上运用”这个过程非常友好。
更高难度的算法可能以我现在的水平无法给出可参考的建议了,相信到那时走到这里的你们也会对算法竞赛以及后续的学习有自己的了解和想法。
大一暑假结束时应该就会初步组队,有了自己的队伍后善用codeforces gym里的比赛资源,三个人协调时间打一下模拟赛,入门班难度的算法最好三个人都会,后面的可以开始分工了,但同一部分内容最好有两个人会,避免比赛时一个人卡题。
刘汝佳《算法竞赛入门经典》(紫书)
内容丰富,算法全(尤其一些比较进阶的算法)。由于出版时间较早,书中选择的一些题目比较老旧,代码风格也与现在不太匹配。并且难度丝毫没有入门的自觉 ... ...不过还是会出现在所有入门指南上的经典书籍。
《挑战程序设计竞赛》(白书)
这个相对来说对入门选手比较友好,但涉及的算法有限,新手可以入一本。
李煜东《算法竞赛进阶指南》(蓝书)
被队友安利到的一本书。个人比较习惯比赛时作为板子携带,印刷和代码风格易懂。难度比白书高一些,但总体来说涉及进阶算法仍然不算多。好像是一本偏 oi 的书,对于 icpc 中会出现的例如计算几何一类的题书中没有收录。
以上三本书是我真的看过的,网上还有众多相关的书籍,因为没有看过就不再赘述了。其实在银牌及以下的阶段,涉及的算法在每本书里大同小异,并且我认为算法学习更多依靠网络资源,不用在书本的选择上过多纠结。
https://zhuanlan.zhihu.com/p/105467597?utm_medium=social&utm_oi=900051642823610368&utm_psn=1644789923470385152&utm_source=qq