程序设计竞赛推荐两本实用书给你

1 什么是程序设计竞赛

本书所指的程序设计竞赛是解题竞赛,指参赛者利用自己所学的计算机相关知识,在限定的时间内解决若干道具有一定难度的编程题目。这些题目一般都与某种算法有关,如果读者没有经过相关的训练,一般难以在限定时间内予以解决。除了解题竞赛以外,还有很多其他类型的程序设计竞赛。例如,以提高程序运行效率为目标的性能竞赛,以完成某个具有特定功能的软件为目标的创意竞赛等。下面介绍一些具有较大影响力的解题程序设计竞赛。

1.1 ACM-ICPC

美国计算机协会(Association for Computing Machinery,ACM)主办的国际大学生程序设计竞赛(International Collegiate Programming Contest,ICPC),是历史悠久的国际大学生程序设计竞赛,其目的在于使大学生运用计算机来充分展示自己分析问题和解决问题的能力。

该项竞赛自从1977年第一次举办世界总决赛以来,截至2020年1月,已经连续举办了43届。该项竞赛一直受到国际各知名大学的重视,全世界各大IT企业也给予了高度关注,有的企业(如IBM、Oracle、惠普、微软等公司)还经常出资赞助比赛的进行。

ACM-ICPC以团队代表各学校的形式参赛,每队不超过3名队员。队员必须是在校学生,满足一定的年龄限制条件,并且每年最多可以参加两站区域选拔赛。比赛期间,每队需要通过1台计算机在5个小时内使用C/C++、Java和Python中的一种语言编写程序解决7~13个问题。程序完成之后提交裁判运行,运行的结果会判定为正确或错误两种并及时通知参赛队。最后的获胜者为正确解答题目最多且总用时最少的队伍。

与其他计算机程序竞赛相比,ACM-ICPC的特点在于其题量大,每队需要在5小时内完成7道或以上的题目。另外,一支队伍有3名队员却只有1台计算机,使得时间显得更为紧张。因此,除了扎实的专业水平,良好的团队协作和心理素质同样是获胜的关键。

1.2 Google Code Jam(GCJ)

Google Code Jam(谷歌全球编程挑战赛)是Google举行的一项国际编程竞赛,目标是为Google选拔顶尖的工程人才。

比赛的每道题目均由Google的工程师仔细设计,既有趣也极具挑战性,选手不仅能测试自己的编程水平,更能在比赛环境中快速提升实践技能,丰富自身履历。该项赛事始于2003年,竞赛内容包括在限定时间内解决一系列特定的算法问题,编程语言和环境的选择不受限制。每年竞赛中所有参赛者在经过4轮线上比赛后,将会诞生25位选手参加在不同Google Offices地点举办的The World Finals,竞争现金大奖及奖杯。

1.3 TopCoder

TopCoder是一个面向平面设计师和程序员的网站,它采用比赛、评分、支酬等方式吸引众多平面设计师和程序员进行业余工作。

该网站每个月都有两次或三次在线比赛,根据比赛的结果对参赛者进行新的排名。参赛者可根据自己的爱好选用Java、C++、C#、VB或Python进行编程。参赛者必须在1小时15分钟内完成三道不同难度的题目,每道题完成的时间决定该题在编程部分所得的分数。比赛可分为三部分:Coding Phase、Challenge Phase和System Test Phase,比ACM-ICPC多了Challenge Phase,这部分是让参赛者浏览分配在同一房间的其他参赛者的源代码,然后设法找出其中的错误,并构造一组数据使其不能通过测试。如果某参赛者的程序不能通过别人或系统的测试,则该参赛者在此题目的得分将为零。

1.4 CodeForces

CodeForces是一个提供在线评测系统的俄罗斯网站,该网站由一群来自俄罗斯萨拉托夫国立大学的程序员创建并维护,其中主要的领导者为Mike Mirzayanov。

CodeForces的每位用户在参加比赛后都会有一个得分,系统根据得分及用户在以往比赛中的表现赋予用户一个Rating并冠以不同的头衔,名字也会以不同的颜色显示。参加比赛的用户按Rating以某个分值为界划分为Div1和Div2两类。相应地,CodeForces上的比赛也会指明是Div1还是Div2,抑或同时进行。Div1的比赛较难,Div2的比赛较简单。如果同时进行,Div1的A、B、C三题会和Div2的C、D、E三题相同。每次比赛结束后Rating都会依据此前各个选手的Rating和公式重新计算。

比赛中,选手有2个小时的时间去解决5道题目,这里的“解决某道题目”是指预测试通过,即通过了一次仅含部分测试点的测评,而最终决定是否得到这道题的分数,要看比赛结束后的统一测评。某道题的分数随着时间线性减少,但不会低于初始分值的30%。也就是说,选手解决问题的速度越快,得分也相应越高。而且,对于选手的每次提交都会扣除一定的分数。例如,某道题目的初始分为1000分,每过1分钟,该题的分数减少4分,如果选手在10分钟内尝试提交了3次并在第3次最终通过了预测试,每次错误提交扣除50分,那么该题的得分为1000−4×10−2×50=860。

同一个Div的选手将被划分到若干个房间里,每个房间约有20位选手。当某道题的预测试通过之后,选手可以选择锁定该题代码,锁定该代码后,选手之后将无法就该道题目进行再次提交(即使发现代码中包含错误)。之后选手就可以查看同一个房间内其他参赛者的代码并试图找出其中的漏洞了。选手可以自己构造一个测试(可以是数据,也可以是数据生成器)使得该代码不能通过,称之为Hack(有时也称Challenge)。一次成功的Hack可以得100分,而如果没有成功,将会被扣50分。最后,所有通过预测试的代码将提交进行最终测试,选手的最终得分为通过最终测试的代码分数和Hack其他选手所获得(扣除)的分数。

CodeForces的题目偏向于考察解题思路,一般较少涉及复杂的算法,标程的代码一般都比较简短而精巧。

1.5 IOI

国际信息学奥林匹克竞赛(International Olympiad in Informatics,IOI),是面向中学生的一年一度的信息学科竞赛。

这项竞赛包含两天的计算机程序设计,用以解决算法问题。选手以个人为单位,每个国家最多可选派4名选手参加。参赛选手从各国相应计算机竞赛中选拔。国际信息学奥林匹克竞赛属于智力与应用计算机解题能力的比赛,题目有相当的难度,解好这类题目,需要具备很强的综合能力。第一,具备观察和分析问题的能力;第二,具备将实际问题转化为数学模型的能力;第三,具备灵活地运用各种算法的能力;第四,具备熟练编写程序并将其调试通过的能力;第五,具备根据题目的要求,独立设计测试数据,检查自己的解法是否正确、是否完备的能力。能够参加IOI的选手应该具有很强的自学能力和动手能力,需要学习有关组合数学、图论、基本算法、数据结构、人工智能搜索算法及数学建模等知识,还要学会高级语言和编程技巧,要具备很强的上机操作能力。国际信息学奥林匹克竞赛鼓励创造性,在评分的标准上给予倾斜,创造性强的解题方法可以拿到高分。

2 如何使用UVa OJ

随着ACM-ICPC程序设计竞赛的推广,各种在线评测(Online Judge,OJ)网站及工具应运而生。其中数University of Valladolid Online Judge(简称UVa OJ或UVa)历史悠久[1]。UVa OJ的特点是题目丰富、题型多样,比较适合中等水平的ACM-ICPC选手训练。

程序设计竞赛推荐书籍:

1、程序设计竞赛训练营:算法与实践

本书是以大学生程序设计竞赛为基础、面向已有C1+入门知识且想要进一步学习的读者编写的 C++进阶训练指南。全书分为回湖法、图、动态规划、 网格等部分。回湖法部分介绍单向搜索和双向搜索,给出高级搜索的技巧;图部分分为图遍历和图算法章节,先介绍图遍历的方法,再以最小生成树问题、单源最短路径问题、多源最短路径问题、网络流问题中的经典算法为例,介绍了十余种算法的原理和相关应用;动态规划部分逐一介绍了集合型、区间型、图论型、概率型、非典型动态规划,并介绍了空间、时间上的优化技巧,以及相应的备忘、松弛技巧;网格部分作为独立的专题汇集了与网格相关的各种习题

本书适合有意参加大学生程序设计竞赛的本科生、研究生阅读,对有意参加信息学奥林匹克竞赛的中学生具有参考价值。

章节安排

本书既是训练指南,又兼有读书笔记的性质。为了表达对Skiena和Revilla合著的《挑战编程:程序设计竞赛训练手册》一书的敬意(它激发了我对算法的兴趣,促使我编写这本书,可以说是让我对编程竞赛产生兴趣的“启蒙老师”),本书的章节名称参考了该书的目录解构,但章节编排、叙述方式和具体内容已“面目全非”。每章均以“知识点”为单元进行介绍,每个“知识点”基本上都会有一份解题报告(题目源于UVa OJ),之后再列出若干题目作为强化练习或者扩展练习。强化练习所给出的题目,一般只需要掌握当前所介绍的知识点就能予以解决。扩展练习所给出的题目,一般需要综合运用其他章节所介绍的知识点,甚至需要自行查询相关资料,对题目所涉及的相关背景知识及算法进行理解、消化、吸收后才能予以解决,其难度相对较高。

本书的所有题目中,除个别题目以外,其他题目均选自UVa OJ,因此不在每道题目前附加UVa以区分题目的来源。为了练习选择的便利,题目的右上角使用A~E的字母来标识此题的“相对难度”。以2020年1月1日为截止日期,按“解决该题目的不同用户数”(Distinct ACcepted User,DACU)进行分级:A(容易),DACU≥2000;B(偏易),1999≥DACU≥1000;C(中等难度),999≥DACU≥500;D(偏难),499≥DACU≥100;E(较难),99≥DACU。难度等级为A~C的题目建议全部完成,难度等级为D~E的题目尽自己最大努力去完成(对于某些尝试人数较少的题目,根据上述难度分级原则得到的难度值可能并不能准确反映题目的实际难度,本书适当进行了调整)。如果某道题的DACU较少,原因有多种:或者是该题所涉及的算法不太常见,具有一定难度;或者是输入的陷阱较多,不太容易获得通过;或者是题目本身描述不够清楚导致读题时容易产生歧义;或者是题目的描述过于冗长,愿意尝试的人较少[2];或者是在线评测系统没有提供评测数据,导致无法对提交的代码进行评判[3]。不管是什么原因,你都应该尝试去解题。对于学有余力的读者来说,研读文献资料并亲自实现算法,然后用习题来检验实现代码的正确性,是提升能力素质的较好途径。

由于本书包含较多代码,为了尽量减少篇幅,每份代码均省略了头文件和默认的命名空间声明。

2、程序设计竞赛训练营:基础与数学概念

本书是针对ACM主办的国际大学生程序设计竞赛的训练指南,主要介绍程序设计和针对竞赛训练所需的基础知识和基本数学概念,包括UVa OJ平台的使用方法、C++的输入输出处理、C++库实现所包含的数据结构、高级数据结构、字符串的处理和相关算法、排序与查找算法、代数、组合数学、数论、几何等内容。本书在介绍基础概念的基础上,引入了众多题目,以C++解题,针对部分题目给出参考代码,方便参考和练习。

本书适合有意参加国际大学生程序设计竞赛的本科生、研究生阅读,对有意参加国际信息学奥林匹克竞赛的中学生具有参考价值,也可作为计算机专业相关课程的参考教材。

章节安排

本书既是训练指南,又兼有读书笔记的性质。为了表达对Skiena和Revilla合著的《挑战编程:程序设计竞赛训练手册》一书的敬意(它激发了我对算法的兴趣,促使我编写这本书,可以说是让我对编程竞赛产生兴趣的“启蒙老师”),本书的章节名称参考了该书的目录结构,但章节编排、叙述方式和具体内容已“面目全非”。每章均以“知识点”为单元进行介绍,每个“知识点”基本上都会有一份解题报告(题目源于UVa OJ),之后再列出若干题目作为强化练习或者扩展练习。强化练习所给出的题目,一般只需要掌握当前所介绍的知识点就能予以解决。扩展练习所给出的题目,一般需要综合运用其他章节所介绍的知识点,甚至需要自行查询相关资料,对题目所涉及的相关背景知识及算法进行理解、消化、吸收后才能予以解决,其难度相对较高。第 3 章~第 5 章的最后一节内容对一些在解题中常用的算法库函数作出了简要的解析和示例。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值