ACM算法的学习,一般看刘汝佳的系列书籍即可。初学者需要看的书是《算法竞赛入门经典》(俗称小白书),或者可以看《算法竞赛入门经典(第二版)》(俗称紫书)。理论上说,紫书的质量比小白书高得多,小白书介绍的内容紫书都有讲,紫书还增加了介绍C++语法的一个章节。但是紫书的题目相当灵活,对初学者来说未必简单(不要因为我这么说就以为小白书的题就容易了),大家可以都先看一看,最后再抉择精读小白书还是紫书,当然最好是紫书。下文我用《入门经典》来统称这两本书。
等《入门经典》学到一定程度,就能结合《算法竞赛入门经典——训练指南》(俗称大白书)一起看。大白书有一定难度,不用着急入手,把《入门经典》的基础打扎实,就已经是一位能独挡一面的ACM选手了。而且大白书涉及方方面面的知识点,一个人根本学不完,一般都是跟队友配合,每个人负责不同模块的题目的。理论上上面三本书足够大学里,从入门到真正的大神,整个ACM生涯的学习了。这三本都学完的神人我就不说什么,只能ORZ了。这里我想对那些一上手连《入门经典》都看不懂或很吃力的同学,补充一些话:
这是很正常的现象,不用自卑。你首先应该先反省自己是不是没有练题光看书,那样看得懂才怪。编程是实践性很强的学科,光看不练再有天赋的人也学不会。说到这,不免吐糟学校不允许大一新生带电脑的制度,这对计算机专业的同学来说,相当于教你怎么打仗,却不允许你带枪。不管怎样,大家想办法克服环境,自己创造机会去多练习C语言。因为算法比赛虽然是比算法,但程序总是要用C或C++写出来的,想法再好,比赛的几个小时写不出程序,也是零分。而很多人一开始看不懂《入门经典》,也很大一部分是语言基础不好的原因。
关于C语言的学习,最经典的入门书籍是《C Primer Plus》,比谭浩强的书强的多,但因为知识系统,内容也多得多。谭的书不用读的太细太认真,否则是在浪费生命学一些错误的东西,那本书用来应付期末考和计算机二级考试即可。要真想学好C语言,就把我推荐的这本书先读完。以后你们自然还会接触很多其它C语言经典书籍。
C学的差不多,就可以学C++了。C++比C语言难得多,但想成为一名合格的ACM选手必须要掌握扎实,其重要性初学者以后就会有体会。C++的入门经典是《C++ Primer Plus》,有一定基础后,可以结合看另一本巨著《C++ Primer》。C++虽然知识很广,但很多语法和特性在ACM中是用不到的。尽管如此,能精通的人受益匪浅,所有的编程语言都是有联系的,学懂C++后将会一通百通。
C++语法学的差不多后,遇到不懂的问题要学会多查文档。文档的内容系统,而且比你网上乱搜到的东西准确多了。说是C++,其实C语言是C++的一部分,所以文档也包含了C语言的内容。
ACM一般都允许使用JAVA语言,很适合用来做高精度题,这个初学者先不用顾虑,至少等知道什么是“高精度”再说。JAVA的效率不及C++,一般也就只能做做效率要求不高的高精度题。
普通同学,先把C的基本语法学好再说,确保书本上或老师布置的作业会做。接着在学校oj(请用校内网登陆)上刷作业或简单题,然后可以看看一些难度中等的题目,结合《入门经典》的前两三章一起练习。
有一定基础后,就可以练习校oj上的难题。《入门经典》也会推荐大量UVA上的题目给大家做,初学者一定要多练,能全部完成当然是最好的,一道都不肯练的人我劝你还是别来acm协会了。
与acm相关的赛事非常多,从简单到难的都有,适合不同能力层次的同学。我先介绍个人赛,这些个人赛都是中文题,除了蓝桥杯是完全封闭的“考试”,校赛是允许携带不限量的纸质资料的。
首先是校内的选拔赛和每年12月的校程序设计大赛。自己出的选拔赛题,目的不同,难度不一,就不做介绍了。校程序设计大赛难度不大,想在这项赛事取得成绩的,可以多做校OJ上的题,把往届赛题全部做完的,完全有能力拿一二等奖。三等奖的名额也非常多,将品(jin)丰厚,欢迎各位踊跃尝试。
其次是蓝桥杯系列赛事,蓝桥杯首先要校内预选,题目也是官方出的,这个我没参加过不了解。校预选中获得名额后,就可以参加蓝桥省赛,省赛获得一等奖后可以去北京参加决赛。蓝桥杯的题目有结果填空题、代码填空题,编程题,难度也不高,而且本一和本二的学校是分开竞赛的,减少了很多强大的对手,我们校去年有十多人进入决赛。想在这项赛事取得成绩的,可以多在官网刷题(估计过了校预选的同学才有资格进入),另外有个很好的网站有收集蓝桥杯方面的题目: 酷记事。下面要介绍的才是真正有含金量的赛事,都是三个人的团体赛,全英文题,比赛时每支队伍只有一台电脑,5个小时,一般10道题左右,允许携带不限量的纸质资料。
首先是福建省程序设计大赛,难度对我们学校也比较合理,每年至少派5支队伍参赛,要拿铜并不是很难,好好学习发展,拿银也是没问题的。主要对手是福州大学,福大是我们省内ACM实力最强的学校,在世界总决赛拿过第19名的佳绩。要在这方面取得成绩的同学,可以多在FZU刷题(福大的程序测评平台,那里也有往届的赛题)。
最后要介绍的就是所有这些比赛的鼻祖,和ACM赛事名称的由来:ACM/ICPC,国际大学生程序设计大赛,我们都简称acm,然后很多其它衍生的赛事也常常直接说acm。世界总决赛,一般说final赛,我们目前完全没有能力进入,只能视频直播看各路神牛的精彩表现。要进入世界总决赛,就要在亚洲区预赛拿到金奖,而我们能进入并且拿到铜,能力已经比较不错了。亚洲赛区有很多,在中国目前有六个赛区。亚洲区预赛一般简称区域赛,也有说现场赛的。那么不考虑final赛。对我们来说有三个赛事:邀请赛、网络赛、区域赛。六个赛区这三个赛事都会举办,要在邀请赛、网络赛打到名额,才能去对应赛区的区域赛。邀请赛要去现场比,网络赛则在自己学校随意,故可以每人一台电脑,甚至准备电子版资料刷题,但千万不要作弊,如不同队伍间分享代码,组织方是有防作弊手段的,查到将会严惩。也因为网络赛更自由,所以题目难度大于邀请赛。故初学者一般先尝试邀请赛的题目即可,这些题目,全部可以在 hdu(杭州电子科技大学测试平台)找到。hdu也是我国最有名的oj之一,网络赛等都是在这个oj进行。比赛之外,需要大量的练习。如果闲上面提供的oj太杂了,可以去VJ,用一个账号,可以在fzu、hdu、uva等多个地方刷题,而且能看到大量别人分享的代码。如果你的浏览器登陆不了,可以试试谷歌浏览器。
有了队伍的同学,也应该经常在一起多进行一些模拟竞赛,另外每年暑假也有有一定难度的暑期多校集训。
当你在acm道路上奋斗一两年后,你学到的不仅仅是算法知识,非常强的实践(码代码)能力,更是自学能力,对事物洞察力的提升,和精神上的升华。
你可以选择专精这项赛事,去收获自己的梦想。也可以花些时间,多去扩展自己的视野。比如数学建模竞赛,也是三人一组,需要团队具备数学建模、编程、论文写作的能力。说到写作,就不得不讲排版,office办公软件(是微软2007版本以上的办公软件,不推荐wps,因为它不支持vba)一定要认真学,这是以后工作必备的能力。相关软件的学习我推荐 oeasy的视频。另外数学,计算机专业最适合使用的排版软件是tex不是word,有兴趣的同学,特别是打算读研究生的,可以在本科阶段就学学LaTeX,这个学习资料推荐刘海洋的《LaTeX入门》。敲代码我不推荐VC6.0,可以用蓝桥杯官方指定的DEV,比较不错的还有CodeBolcks。
(本段选读)对C语言开发过程比较了解的同学,应该知道代码编辑和代码编译是两回事,可以分开进行的。代码编辑软件我推荐vim、notepad++,有兴趣的同学可以学学看。在编辑器配置上,会涉及环境变量等一些相关知识,有困难的同学可以找我咨询。说到环境变量,有时也会涉及命令行,作为一个程序员多少是要懂点的,《入门经典》附录也有简要介绍。
说这么多,是想指明一条条路都应该怎么走。而不是要你一下子全部学会,很多东西都将会陪伴你整个大学,甚至人生。学习的过程切记浮躁,要打好基础,一步一个脚印。