算法竞赛怎么入门

说有很多学弟学妹来询问如何入门算法竞赛,于是就仗着自己一点点浅薄的经验,来向大家简单的讲一讲,也是自己高中 OI 生活的分享和总结吧。

个人经历

我个人是高一 9 月份开始进入算法竞赛的,自此三年间都没能完全脱离它。由于对计算机很感兴趣,于是高中一入学就进入了学校竞赛队开始学习信息学奥赛。从学编程语言到学算法、数据结构和数论等内容,从最简单的 $A+B$ Problem 到之后各种校内比赛和正式比赛,收获很多,付出很多,痛苦也很多。

曾经为了备战考试,三个多月没有学过一点文化课回过一趟班级,天天泡在机房里面。也曾经为了备战考试,每天早上六点到机房凭借肌肉记忆打各种板子,像并查集,线段树模板等等。三年中,结识了很多竞赛中的朋友,有天资聪颖,入选国家集训队的姚班大佬,也有因为竞赛失利高考失利而被迫去了不是很好的学校甚至复读的同学。

现在回想 OI 生涯,觉得有一点不甘有一点后悔,更多的还是感激吧!这三年,我学习到了很多算法和数据结构,学到了很多数学知识,学到了很多计算机知识,熟练掌握了很多工具,更是积累了很多经验。

如何学习算法竞赛

首先我想对那些只是单纯想凭借这个类型比赛而积累科创积分以获得奖学金和升学优势的同学说:“不要参加这个比赛,它不适合你!” 算法竞赛需要学习的内容很多,很细,有些也很复杂,而且相应的题目也可能会很难。简而言之,这个比赛性价比并不高!

然后就到了本篇文章的正题:如何入门算法竞赛?

编程语言基础

算法竞赛对编程语言要求并不高,在这里建议使用C++作为参赛语言(只是个人建议)。

要求不高到什么程度呢:你甚至只需要掌握到数组部分,会循环语句,条件语句等基础内容,会一点点STL 库的内容就可以,而且不需要会指针,因为实际比赛是会这些东西就足够了。

至于为什么不把Java作为推荐的语言,是因为Java或多或少的强调了很多OOP(面向对象编程)的内容,这些也是不需要体现在算法竞赛中的。

总结一下:编程语言稍微会点就足够打算法竞赛了!

算法内容

对算法竞赛来讲,会编程只不过是基础,你真正要学习的内容还有很多很多很多!例如:基础算法,数据结构,图论,数论等等。

我给出的学习建议是看书,书籍会按照优先级列在下面,同时也有阅读方法。

这一部分,有些算法很简单,很容易理解,当然也会有大部分算法不是那么好理解。如果你学习某一个算法或者结构的时候遇到了困难,去网上找找博客文章再去反复理解一下,尤其是要对着找到的正确的实现代码一步一步写注释,这一步是干什么的,下一步有什么用处,对应算法里面的那个部分。如果还不理解,就询问你认识的同学寻求帮助,千万不要钻牛角尖!

还有个技巧,就是背诵!书读百遍其义自见。我自己笨,以前学竞赛的时候就一边看着找到的正确的代码,一边自己对着自己重复打上几遍,慢慢就理解了。

至于阅读书籍,由于是个很重要的部分,就在这里特别的写一下:

首先,我推荐这几本书:

  • 《算法竞赛入门经典》刘汝佳,这本书由于封面是紫色,也被称为紫书。
  • 《算法导论》圣书不必多谈,不过是偏重理论没有任何实现代码。可以作为辅助书籍。
  • 《挑战程序设计竞赛》巫泽俊

其次,阅读方法的话,建议是盯准一本书读,不要看看这个看看那个,把网络上一些博客文章作为辅助你理解的东西。另外,去网络上寻找资源是一个很重要的能力!

刷题

刷题这个东西应该是贯穿始终的。你学完一个算法或结构后就应该开始刷题,刷这一部分的题目!

首先推荐刷题网站 luogu,你可以按照题单刷题,也可以按照分类刷题,响应的比较方便。luogu 刷到一定能力了就可以去 codeforces,hdu,poj,atcoder 等网站刷题,题目质量都很高!

总结和代码习惯

一定一定要养成总结的习惯,不管是学习完一部分内容还是做完一道比较有水平的题目,都要写一下总结。可以是博客形式的,发到博客园,csdn 上这种,也可以就自己存着自己看。

其次是注意代码风格,一定多写注释,代码要写的好看,这是可以收益终生的事情!另外,代码要多写!

一些技巧

  • 调试:学会调试你的代码,可视化你的思路,对应着示例数据找为什么“我的结果不对”。
  • 对拍:学会简单的脚本编写,可以是 bat 也可以是 bash,用来生成大量数据验证你的代码对不对。(初学可以忽略)

有什么问题可以在群里提出或直接联系我!

updatedupdated2021-10-032021-10-03