从14年Google Code Jam Round 1悲惨地被淘汰,正式开始学习算法竞赛开始,一晃眼快两年了。水平似乎是在非常缓慢地提高,但手速随着入职,以可观的速度在降低……唯一可以聊以自慰的的是,每次做出一道比较难的题的时候,我还是能感觉到那种由衷的快乐,学大神Laycurse的一句:Have fun!
既然是开篇,今天就不讲具体的算法姿势了,就简单讲一下我对算法姿势,比赛,如何提高水平的一些肤浅的理解。
比赛和做题中需要的知识和技术非常多,但题目大致可以分为以下几类:
-
机智题:一般出现在Topcoder div 1 easy/Codeforces div 1 A。一般只需要很少的背景知识,但需要比较好的逻辑思维,题目类型不定,代码一般很短,有些题目还非常有趣,个人觉得很适合作为面试题……可以认为是算法比赛的前菜。一般只需要脑子里转一个弯即可。代码量~20行。
-
标准题:一般出现在Topcoder div 1 medium/Codeforces div 1 B/C。需要一些知识,一般来说没有做过一定数量的题目,纯靠智商很难做出来。有些题很吃经验,有些技巧,第一次遇到,几乎不可能自己独立想出来……Topcoder的话,一般是DP(动态规划)或者网络流,Codeforces的话还喜欢放线段树。代码量~50行,也有特别坑的时候……
-
神题:一般出现在Topcoder div 1 hard/Codeforces div 1 D/E。除了非常偶尔能做出来几道题之外,很多题是看题解也看不懂,水平不知道高到哪里去了,暂时不讨论……
根据需要的知识,还可以另外分类为:搜索,DP,数据结构,数学,图论等等,我比较喜欢做DP题和数学题,我以后就主要讲讲这两类。
如何提高呢?简单粗暴……做高质量的题就可以了。高质量的题在哪里呢?个人觉得Topcoder的题目质量非常高,而且还有editorial,搞不出来的时候还可以看题解,也可以看大神写的代码,只要能坚持,一定可以变得很厉害。Topcoder分为division 1和division 2,大概每周有一场比赛,叫Single Round Match,简称SRM。每场比赛75分钟,三道题:easy,medium,hard。题目难度大概是:div2 easy < div2 medium ~ div1 easy < div1 medium ~ div2 hard < div1 hard。可以根据自己当前的水平,主做某一档的题,如果一档的题可以随便秒了,就可以刷上一档了。做题的时候,不建议想破头,也不建议不会就马上看答案。看到一道题,思考一小时没有很好的头绪的话,可以看答案学习,学习好了之后,思考一下哪里欠缺,再自己写一遍通过就可以了,不用刻意追求所有题自己独立做出来。死磕的时间成本太高,并不适合前期的学习。
比赛的话,分为两种:一年一度的大赛和每周末的周赛,以及野鸡比赛……大赛的话,就是一月份的Facebook Hacker Cup,三月初开始的Topcoder Open,四月初开始的Google Code Jam了,这些可以认为是每年的大满贯赛事。前年白俄罗斯天才少年Gennady Korotkevich完成了全满贯,每个赛事的含金量都相当高,世界最顶级的选手都会参加,竞争非常激烈。。我这种水货选手,每次就是冲着骗衣服参赛(一般前几百名可以拿衣服),同时感受下跟大神的智商的差距……周赛的话,主要就是Topcoder SRM和Codeforces的Round Match了。基本每周都有比赛,但工作之后,时间老是冲突,参加频率就很低了。每个选手有一个rating,根据参加的比赛表现的好坏,rating会有变化,类似于游戏平台的天梯积分。
说一点题外话,算法竞赛的本质是什么呢?对我来说,算法竞赛就是一个游戏,玩得时候很开心,玩完之后并不会感到内疚,而且可以保持思维活跃。我不清楚把所有不睡觉的时间全部投入工作中时候是一件可能的事情,但我个人来讲,我还是想好好利用工作以外的时间,做自己真正喜欢做的事情。
进公司之后才发现,绝大部分同事并不热爱算法,真正喜欢算法的,而且工作之后还能保持热忱的,真是少之又少。怎么说呢,感觉是更加验证了我的想法:算法比赛只是一个游戏,如果不能从中得到快乐,那就做能得到快乐的事情就可以了。就像有些人喜欢看电影,有些人喜欢玩游戏,有些人喜欢钻研技术,有些人喜欢做题罢了。还是那句话:Have fun!