作者:empty 页数:320 出版社:empty |
酷爱编程的人们往往喜欢挑战,但大多数程序员对各种程序设计竞赛却是“敬而远之”,为什么会这样呢?原因在于,学习编程语言和软件开发的知识只是接受这些挑战的必要而非充分条件。要想在程序设计竞赛中脱颖而出,还需要更多的知识和技能。而这些知识和技能,却是很难在传统的课堂和教科书中学到的。本书的目标读者便是那些已经具备初步的编程技能,对程序设计竞赛充满好奇,希望有机会武装自己、接受编程挑战的人,以及他们的老师和教练(甚至父母)。即使不参加任何竞赛,从本书的编程挑战中学到的东西,也会对程序员的职业生涯产生重要影响,更不用说这些挑战本身就是充满乐趣、引人入胜的。本书文字精练、通俗易懂。尽管每一章都涉及一个不同的领域,但篇幅却短得甚至可以一气读完。另外,所有题目均附有难度、流行度等客观评价系数,并可以在线提交。写出程序并不意味着完善的解决了难题,只有通过了评测系统的严格把关才能让人信服。算法大师StevenS.Skien a教授和在线评测系统UVa OJ的创立者Miguel A.Re vila教授邀请译者完成本书的翻译工作,提供了书的源程序和插图,并讨论书中的一些细节;感谢清华大学出版社的龙啟铭编辑,他对工作认真负贵的态度和严谨的科学作风令人钦佩。尽管我们付出了许多努力,但译文中难免有翻译不当之处,敬请批评指正。
计算机编程能给人带来很多特殊的快乐。付出总会有回报,亲手做出一个有用的东西并国际编程竞赛题目中的游戏、谜题和挑战是体验这些快乐的绝佳途径,同时还能提高你本书可用于自学、讲授算法、编程类创新课程以及比赛的训练。本书中的题目选自Valladolid大学在线评测系统(http://uva.oninejudge.org/) 中的上千多数题目都很生动。它们展示了计算机科学和数学中令人着迷的话题,有时还会以搞笑基于上述原因,本书的第一个部分主要关注编程技巧,包括数据类型和库函数的合理运看着它成功运转时,你为之满足;灵光一现,于是轻松解决一个困扰你多年的问题时,你为之兴奋;对美的执着追求能让一名普通黑客成为艺术家,而吝啬己然成为了一种美德,尤其是从那些经过锤炼后的精巧算法和简洁代码中榨取最后一滴“性能之油”·的算法能力和编程技巧。本书包含了百余个历届比赛中出现的题目,并讨论了解决这些题目所需的理论和思维方式。读者可以在两个在线评测系统中提交其中任何一道题目的程序,并获得即时的自动评分。若能将评测系统和本书有机结合,你会亲身体会到:迎接挑战和提升编程水平是一件多么新奇、刺激的事啊!致读者道编程题目。到目前为止,该系统已经评测了来自27000个注册用户的超过一百万份提交。我们只选择了精品中的精品,即那些最好玩、最刺激和最有意思的题目。我们把这些题目分成若干个类别,然后提供了足够的教学材料(主要是数学和算法)来帮助你解决它们。书中配备了很多参考程序来更好地讲解重要的概念。阅读本书并尝试解决这些题目,你会对回溯法、动态规划等算法技巧以及数论、计算几何等高级话题有更加具体和深刻的理解。即使不参加编程竞赛,关注这些东西也是十分有益的。故事的面目出现。它们往往涉及一些有意思的领域来深入学习研究,因此在合适的时候,我们总是给出注解和进一步的阅读材料。我们发现,主要接受项目开发和软件工程方面训练的人们通常忽视了算法的重要性。类似地,理论派算法研究者往往低估了把算法转化为程序的难度,也不清楚编程智慧如何化繁为简。用。这些是书中第二部分那些以算法为主线,难度更大章节的基础。要想成为一名全能的问题求解大师,必须同时精通这两个部分。
这样的课程对所有相关人士来说都是愉快的。学生的潜能很容易被比赛本身的刺激所激发,并且每次提交通过一道题目时都将得到增强。最直白的程序可能会被测试系统返回“超时”信息,于是学生会很自然地寻找更有效的解法。正确的洞察力会让一个十余行的小程序取代一大片杂乱无章的代码。最优秀的学生甚至自愿尝试更多的题目来获得快感。讲授这样的课程也是愉快的。很多题目十分精巧,尽管在算法和编程本质上并无特殊之处,但题目却令人耳目一新。对于这样的问题,要找到最佳解法需要洞察力和灵感。寻找这些题目的解法是令人兴奋的,而当我们所教的学生独立找到解法时,我们会更加兴奋。·作为标准算法教材的补充——尽管本书体系完整,写作时仍然考虑到大多数学生已有了一些算法基础。本书是作为传统算法课程的补充教材来设计(与定价)的,它用具体实现补充抽象描述,用实践经验补充理论体系。另外,它还涉及一些多数标准教材中都没有提到的有趣主题。
提供经典算法的完整实现——很多学生在把抽象的算法描述转化成能正确运行的代码时困难重重。为了帮助他们,我们精心编写了书中所讨论的所有重要算法的程序。这些程序只用到C语言的一个子集, 因此C++和Java程序员也能轻易看懂。书中的不少习题都只需适当修改这些例程即可解决,从而为初学者提供了一条宽敞的入门之路。·内置课程管理系统—我们已经打造了一个特别的课程管理系统,使得管理一门这样的课程易如反掌。所有测试和评分都是自动进行的,你完全不必操心!用我们的网站http://wuw.programming-challenges.com可以轻松管理花名册、布置作业、查看学生的程序和分数,甚至还能检测到疑似作业!·帮助程度参差不齐的学生——本书在题目选择时有意覆盖了一个较宽的难度范围。多数题目适合初学者,而其他题目即使对于备战国际竞赛的选手来说也是富有挑战的。我们为多数题目提供了解题提示。目的流行度(A, B, 或C) 是指有多少人提交过此题, 而成功率(low表示低, high表示本书尤其适合作为高中和大学的编程竞赛培训材料。我们为数学和算法中的重要主题自动评测系统像ACM/ICPC中的真人裁判一样检查所提交程序的正确性。只要你拥有为了帮助竞赛选手, 我们请到了三个重要编程比赛——ACM国际大学生程序设计竞赛本书有两个配套网站。书中的所有题目均可在http://www.prograrnming-challenges.com本书中的所有题目(以及很多其他题目) 也可以在Valladolid大学在线评测系统http://1译者注:两位都以提出了大量有趣但富有挑战性的数学谜题而著称。为了帮助学生挑选适合自己的题目,我们给每道题目标注了三种类型的难度值。题高)是指这些人中正确解决此题的比率。最后,题目的等级(从1到4,大致表示从新手到高水平读者)表示解题者应具有的水平等级。致竞赛选手与教练提供方便的总结和参考,还配备了合适的挑战题目来帮助你掌握这些内容。该系统的个人账号, 你就可以提交c、C++、Pascal或Java程序, 然后等待系统告诉你这个程序是对还是错。系统还会为你保存一份统计信息,让你有机会与成千上万的其他用户进行对比。
(ICPC) 、国际信息学奥林匹克(IO) 、TopCoder编程挑战赛—的决赛选手分享经验, 并把这些成功的秘密写在附录中。我们还介绍了这三项赛事的历史和参赛方法,最大限度地帮助你施展才华。大约有80%的ACM/ICPC决赛选手用Valladolid在线评测系统进行训练。ICPC全球总决赛常常在夏威夷这样令人神往的异国他乡举行,这无疑为选手们提供了额外的精神动力。加油吧!相关网站提交,该网站还提供了一些辅助材料,包括书中所有程序的电子版以及帮助教师们把书中的材料融入课堂的课程笔记。uva.onlinejudge.org/中提交。书中的所有习题均同时标注两个评测系统的ID号,供读者选择。
致谢本书的成书在很大程度上归功于那些欣然授权把他们设计的竞赛题目用在本书和在线评测系统中的人们。本书中的题目由来自四大洲的至少17位命题者提供, 尤其是GordonCorr nack和Shahriar Manzoor, 就好比Sam Loyd和H.E.Dude ney l一样!作者和题目的完整列表见附录, 但我们要在这里特别感谢如下的竞赛组织者:GordonCormack(38题) , Shahriar Manzoor(28) , Miguel Revilla(10) , Pedro Demas i(8) , Manuel Carro(4) , Ru jia Liu(刘汝佳) (4) , Petko Mink ov(4) , Owen Astra kan(3) , Alexander Denis juk(3) , LongChong(龙翀) (2) , Ralf Engels(2) , Alex Gev ak(1) , Walter Guttmann(1) , A run Kishore(1) ,Erick Moreno(1) , U dvr an toP atik(1) 以及Marcin Wojciechowski(1) 。其中的部分题目由第三方设计,我们已在附录中向他们致谢。
评测系统反馈.
如何阅读本书的程序·
3n+1问题(3n+1 Problem) .
扫雷(Minesweeper)
旅行(The Trip)
液晶显示屏(LC-Display) ·
图形化编辑器(Graphical Editor)
解释器(Interpreter)
将军(Check the Check)
澳大利亚投票(Austral an Voting)
数据结构·.
挑选你的武器.
1.2.1程序设计语言
1.2.2
1.2.3标准输入输出
1.3
编程提示
1.4
基本数据类型.
1.5
关于习题
1.6习题
基本数据结构.
2.1.1栈
2.1.2队列
2.1.3字典
2.1.4优先队列.
C++标准模板库.
WERT YU键盘(WERT YU) .
寻找单词(Where’s Waldorf?)
公共排列(Common Permutation)
解密II(Crypt Kicker II)
自动评测脚本(Automated Judge Script)
文件碎片(File Fragmentation) .
Doublet序列(Doublets)
3.8.8Fmt程序(Fmt) ·
排序的应用·
程序设计举例:给绅士排名.
与排序相关的库函数
4.6.1Vito家族(Vito’s Family)
4.6.2煎饼堆(Stacks of Flapjacks)
4.6.3过桥(Bridge)
4.6.4最长打盹时间(Longest Nap) ·
4.6.5鞋匠的烦恼(Shoemaker's Problem) ·
4.6.6CD VII高速公路(CD VII) .
4.6.7龟壳排序(Shel Sort)
4.6.8足球(Football(aka Soccer) )
5.1.1整数库函数.
5.5.1如何处理实数
5.5.2
分数.
5.5.3十进制实数-
5.6.1多项式运算.
5.6.2多项式求根.
程序设计实例:纸牌大战·
2.4
准备行动.
2.5字符串输入输出·
第3章
快乐的跳跃者(Jolly Jumper)
扑克牌型(Poker Hands)
罢工(Hart als) -
解密(Crypt Kicker)
完美洗牌术(Stack'em Up)
Erdos数(Erdos Numbers) .
比赛记分板(Contest Scoreboard)
Yahtzee游戏(Yahtzee) ·
注解
字符串·
3.1字符编码
3.2字符串的表示
3.3
程序设计实例:公司更名
3.4
模式查找
3.5字符串操作
3.6
程序的完成.
3.7
字符串库函数
3.8习题
3.10注解.
第4章排序.
4.1
4.2排序算法
4.3
4.4
4.5给绅士排名·
4.6习题.
4.7提示
4.8注解·
第5章算术与代数.
5.1机器算术.
5.2高精度整数.
5.3高精度算术.
5.4进制及其转换·
5.5实数
5.6代数
5.7对数
5.8实数函数库.
第6章
小学生算术(Primary Arithmetic)
反转相加(Reverse and Add)
求解线性同余式
不定方程
考古学家的烦恼(The Archeologist's Dilemma)
仅由1组成的数(Ones)
乘法游戏(A Multiplication Game)
多项式的系数(Polynomial Coeff cients) ·
斐波那契计数(How Many Fibs?)
土地分割(How Many Pieces of Land?) ·
数数(Counting) ·
括号表达式(Expressions) .
完全树标号(Complete Tree Labeling)
牧师数学家(The Priest Mathematician)
自描述序列(Self-describing Sequence)
数轴行走(Steps) ·
寻找素数
素数的个数
最大公约数
最小公倍数
7.4.1同余运算.
7.6.1开灯与关灯(Light, More Light)
7.6.2Carmichael数(Carmichael Numbers)
7.6.3欧几里德问题(Euclid Problem) .
7.6.4阶乘与整除(Facto visors) .
7.6.5四素数之和(Summation of Four Primes)
7.6.6Smith数(Smith Numbers) .
7.6.7弹珠(Marbles)
7.6.8重新打包(Repackaging) ·
程序设计举例:八皇后问题.
8.6