算法竞赛经验分享

我学习算法差不多已经有 1 年半了,以后应该不会再学竞赛算法了,所以我趁着现在写一个经验分享,希望可以帮助到那些想要入坑的同学。

个人不是 acmer 所以对 acm/icpc 等国际性比赛无法提供有效的指导。

算法分为项目算法竞赛算法。他们的区别是:

  • 项目算法更注重一个功能的实现,同时,题目比较简单。题目的类型多为数据结构相关的题目
  • 竞赛算法更注重一个问题的抽象化和建模能力。题目千奇百怪,什么方面的问题都会考。

对于项目算法,这里推荐去力扣刷题。不过听说力扣现在也有往竞赛方向发展的苗头。

对于竞赛算法,可以去牛客,洛谷,acwing 等网站学习。

在开始学习算法之前,首先要有一个决心:每天至少刷 8 小时的算法。上午 2 小时,下午 4 小时,晚上 2 小时。学习算法的过程是非常枯燥的,同时,也是非常打击人的。每天看着自己写的代码,一直 wrong answer 或者 segment fault 是一个非常痛苦的过程,所以在开始之前一定要有充足的心理准备。等你做好心理准备以后,接下来就是要学一个语言,我学的是 c++,各位可以依据自己的爱好来学。如果没有头绪,那么选择 c++即可,因为 c++的题解是最多的。

在学习的时候,不可以盲目的学习算法,即:看到一题写一题,这样是非常没有效果的。可以买一本关于算法的书,比如《算法竞赛进阶指南》等等。或者看课学习。我个人是在 acwing 上购买了算法基础课来学习的。这里不是打广告,各位可以来看我在 acwing 上的个人主页。因为我觉得这个上面的课的质量还是不错的,所以才说一下。按需要购买吧。

在学习算法的时候,一定要记笔记。注意,这里的笔记不是手写在笔记本上的笔记,而是电子笔记。看到一个新的题解思路,可以将这个思路发布在自己的个人博客上。这样不但可以加深记忆,同时,也可以记录下自己学习算法的路程。我当时没有这个意识,直接今年才知道这个好的方法,所以我希望看到我这个笔记的同学一定要好好的记笔记。我以后闲下来了以后,会一点一点的补笔记的。

在学习完一个算法以后,过一段时间一定要复习一下这个题目的思路。我的复习频率是:

次数 1 2 3 4 5 6 7 8
天数 1 1 2 4 10 20 40 已经记住

这里解释一下这个表格:如果是第次复习完这个代码,那么就在后天再复习一下代码。如果是第 i 次复习完这个代码,那么就在后 j 天再复习一次。注意:这里的复习完的意思不是学习完,而是自己根据题目的描述和给的样例,可以写出来 ac 代码。如果 ac 了,那么说明今天复习成功;如果没有 ac,那么将复习的次数减 1,然后再根据上述表格得出下一次复习的时间。

加油吧,算法竞赛是一个很长的路,途中充满了困难和折磨。