acm初学者应该准备和阅读什么?

刚接触信息学领域的学生,往往会有很多困惑,不知道从哪里开始学习。在这篇文章里,我希望和大家分享我的几点经验,希望对你有所帮助。

第一,语言是最重要的基本功。

不管你关注什么,只要是最终通过计算机程序实现的比赛,语言都是大家要过的第一道坎。亚运会支持的语言包括C/C++和JAVA。作者先说说JAVA。众所周知,JAVA作为一种面向对象的王牌语言,在大型项目的组织和安全方面有着自己独特的优势,但是对于信息学竞赛的特定场合就不那么适合了。它对iostream的操作比C++复杂得多,更重要的是JAVA程序的运行速度比C++慢10倍以上,但竞赛中JAVA程序的运行时间限制往往没有同比例放宽。其实我并不提倡人们在这种情况下过多的使用面向对象的编程思维,因为对于小程序来说,不仅需要花费更多的时间来编写代码,还会降低程序的执行效率。

接着讲C和C++。许多听课的学生还是大一新生。他们刚学完C的基础知识,还没接触过C++。其实在赛场上用纯C的选手也不少。他们主要看重纯C在效率上的优势。因此,如果时间有限,这些学生不需要急于学习新的语言。只要他们提高算法设计的造诣,纯C就能发挥很大的作用。

与C相比,C++在iostream上的封装大大方便了我们的操作,降低了出错的可能性,可以很好的在标准流和文件流之间切换,方便调试。如果有同学在意这个,可以尝试C和C++混合使用。毕竟只学C++的流操作,花不了多少时间。

C++的另一个支持来自标准模板库(STL)。对基本数据结构的统一接口操作和库中提供的基本算法的实现,可以缩短我们的代码长度,可以节省一些时间。但相比之下,使用STL需要在效率上做出一些牺牲,对于输入规模较大的题目,有时必须舍弃STL,也就是说不能有“有了STL,就可以忽略基础算法的实现”的想法;另外,要熟练恰当地使用STL,必须经过一定时间的积累,准确理解各种操作的时间复杂度,避免滥用STL不熟悉的部分,因为其中包含了很多初学者不容易发现的陷阱。

通过上面的分析,我们可以看到,就信息学奥数而言,对语言的掌握不要求很全面,但是经常用到的部分一定要很熟练,不能有歧义。我举一个真实的例子来说明这个道理——哪怕是轻微的语言障碍也可能导致错误:

在去年清华的比赛中,有一支队伍在做F题的时候使用了cout和printf的混合输出。因为一个有缓冲,一个没有,时间长了输出就乱了。只是因为judge team中负责F题的人眼尖,看到答案正确但顺序不对(答案超过一页,是所有问题中输出最长的),看了一下程序,发现只是输出问题,给出了一个演示错误(格式错误)。如果考官不是这样,而是直接给出一个错误的答案,我相信这个团队很难发现自己错在哪里。

现在我们转到第二个讨论,基础学科知识的积累。

第二,以数学为基础的基础知识很重要

虽然定义为编程比赛,但参赛者遇到的问题更多的是缺乏解决问题的思路,而不是缺乏平时积累的基础知识。今年的世界决赛由波兰华沙大学获胜,其成员来自数学系而非计算机系。这是一个生动的例子。竞赛涉及的基础学科主要以数学为主,物理、电路等方面可能会有一些应用,但不多。所以,大一新生也不用觉得自己还没学完数据结构,赶紧拿起数学吧!我来说说竞赛中应用的数学主要分支。

1,离散数学——离散数学作为计算机科学的基础,是竞赛中涉及最多的数学分支,其最重要的在于图论和组合数学,尤其是图论。

图论之所以应用广泛,是因为它的变化最多,可以很容易地把基本的数据结构和很多算法的基本思想结合起来。常用的知识有连通性判断、DFS和BFS、连接点和关键路径、欧拉路径、最小生成树、最短路径、二部图匹配和网络流。这部分虽然比重很大,但往往是竞赛中的一道难题。如果一个初学者对这部分的一些具体内容一时感到不知所措,不要着急,可以慢慢积累。

大部分竞赛设计的组合计数问题都需要用组合数学来解决。与图论相比,组合数学中的知识更简单,很多都是小学上过奥数的同学所熟悉的,但有些部分需要对代数结构中的群论有初步的了解才能学习。组合数学在竞赛中很少以难题的形式出现,但如果积累不够,这个领域的任何题目都可能成为难题。

2.数论——质数判断同余模型构造的问题往往需要更多的数论知识才能解决,在竞赛中并不是很重要,但只要来一块,就足以让知识不足的人苦思一阵子。素数判断和同余在以密码学为背景的题目中最为常见。利用密码学常识确定近似过程后,核心算法往往涉及到数论的内容。

3.计算几何——计算几何相对于其他部分是相对独立的,也就是说很少和其他知识点过多结合。常用的部分有线段相交的判断、多边形面积的计算、内点和外点的判断、凸包等。计算几何的问题不会很难,但绝不会是最弱的问题。

4.线性代数——线性代数的应用围绕矩阵展开,一些看似模拟的题目往往可以借助矩阵找到更好的算法。

5、概率论——比赛用黑箱评判,这意味着你几乎不能用概率算法的思想,但这不代表概率没用。在这一点上,我们只能通过一定的实践来理解。

6、初等数学和解析几何——这主要是中学的知识,用的不多,但至少比高等数学多。我觉得有必要熟悉数学手册里的相关内容,至少要知道去哪里找。

7.高等数学——我接触过的纯粹用高等数学的题目只有一个,但有些题目的叙述背景往往需要和这部分有关。牢牢掌握它总是无害的。

以上是竞赛涉及的数学领域,可以说范围相当广。我认识的很多人搞信息学竞赛就是为了逼自己多学点数学,因为数学是一切的基础。

第三,数据结构和算法才是真正的核心。

虽然数学很重要,但是如果三个只懂数学的人参加比赛,我相信大多数情况下,他们会得到比三个只懂数据结构和算法的人更悲惨的结局。

我先说一下数据结构。需要掌握队列、栈、图的基本表达和操作。至于树,我个人认为需要建的问题有但不多。(但是树往往是非常重要的分析工具。)此外,排序和搜索并不需要精通所有的方法,但你必须确保你有一个解决方案,满足每种情况在时间复杂度上的最低要求。说到时间的复杂度,就该说说哈希表了。比赛中的时间限制远远多于空间限制,这就需要大家尽快掌握“以空间换时间”的原理和策略。可以存储在哈希表中的数据在那时一定不能被搜索。如果真的不可能建立哈希表,让我们看看是否可以建立一个二叉查找树等。——这些都是争取时间的策略。掌握这些技能需要大家对数据结构,尤其是算法的复杂性有一个全面的理性和感性的认识。

然后说说算法。最基本和最常用的算法是搜索,主要使用回溯和分支定界法。这里我想说的是,有些初学者在学习这些基本的搜索算法时,并不太注意剪枝,这是非常不可取的,因为所有的搜索题目都不会给你大规模的测试用例,你往往也注意不到程序的运行时间,但是真实的测试数据一定会过滤掉那些没有剪枝的算法。其实参赛者基本都是用常用的搜索算法,题目的差异化程度往往是基于剪枝等优化。

另一类常用的算法是基于“相似或相同的子问题”,包括递归、递归、贪婪方法和动态规划。其中动态编程更难掌握,如何抽象出重复的子问题是很多题目的难点。我建议初学者仔细了解一些图论中基于动态规划的基本算法(比如Floyd-Warshall算法),多读一些定理的证明,虽然不能直接帮助,但是长期坚持会对思考很有帮助。

第四,团队合作

从上面的介绍可以看出,信息学奥数的知识面很广,光靠他自己消化这些东西是非常困难的,这就需要我们尽可能的发挥团队合作的精神。同组成员之间娴熟的配合和默契是需要时间的,具体情况因成员构成而异,这里就不多说了。

五、练习、练习、再练习

知识的积累固然重要,但是信息学毕竟不是看出来的,而是实践出来的,这是很多前辈最深的体会。只有通过具体题目的分析和实践,才能真正掌握数学的运用和算法的应用,并在不断的实践中增加编程经验和技巧,提高对时间复杂性的感性认识,优化时间的分配,加强团队合作。总之,这里绝对不能纸上谈兵。你必须通过实战来锻炼自己。

大家一定要问,从哪里可以发现问题,如何检查程序是否正确?这个不用担心。现在有很多在线解题网站,提供了大量的题库,支持在线阅卷。你只需要提交程序源代码,马上就能知道你的程序是否正确,运行的时间和消耗的内存。下面我给你推荐几个网站。我不建议你把这几个站点的题都做,选一个就好,因为每个站点的题都有一定的难度。一套系统的题库,可以让你知道各种难度,各种类型的题。

1、乌拉尔:

乌拉尔是中国学生对俄罗斯乌拉尔州立大学的简称,该校设置了乌拉尔在线问题集,支持在线评判。乌拉尔的很多题目都是算法的,很有趣,深得国内学生的喜爱。据“信息学初学者之家”网站统计,乌拉尔的题目类型大致分布如下:

考试问题的类型

搜索

动态规划

贪婪

结构

图论

计算几何

纯数学问题

数据结构

其他的

的比例

大约10%

大约15%

大约5%

大约5%

大约10%

大约5%

大约20%

大约5%

大约25%

这和实际比赛中的题量分布大致相同。感兴趣的朋友可以去看看。

2、UVA:

UVA代表西班牙的瓦拉杜利德足球俱乐部大学。其中一所大学建立了带在线评判的习题集档案,支持在线评判,类似乌拉尔大学的题库。但与乌拉尔不同,UVA的题目很多且复杂,有些题目的测试数据比较棘手。这就让刚到那里做题的朋友经常无所适从,或者很难找到合适的题目,或者错了很多次还是不知道错在哪里。如果乌拉尔题目主要是为了训练算法,那么UVA题目可以训练全方位的基本功和一些必要的编程素质。UVA和很多世界知名大学联合举办同步线上比赛,所以那里有无数的强者,但是你首先要让自己明白他们在说什么:)

3、ZOJ:

ZOJ是浙江大学建立的在线法官,是中国大学建立的第一个类似网站,也是最好最受欢迎的一个。笔者和很多同学都在这里实习。虽然ZOJ也定位为英文网站,但是这里有很多中国留学生,让人感觉很友好。目前这里有500多个题目,难度适中,用索引覆盖了各大洲的题目类型。另外,ZOJ的JUDGE系统是几个表现不错的网站之一,很少出现回答错误和演示错误的混淆。这里每月还有一次线上比赛,所有注册用户都可以参加。

说起国内的在线评委,去年才开始参加ACM比赛的北大,现在已经建立了自己的投稿系统。我们学校去年也开始参加比赛,现在有可能推出自己的投稿系统。如果可以做到,那么大家都可以去it做题。类似网站的快速发展表明越来越多的学生对探索信息学领域感兴趣,这是一件好事,也意味着更激烈的竞争。

看看这篇文章能为你做些什么!我也是ACM的初学者!