算法竞赛实战笔记
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

前言

亲爱的读者,我十分荣幸地把本书献给你。你可能是准备踏入算法竞赛大门的学生,也可能是久经考验的赛场高手,或者是工作在一线多年的工程师。虽然我不认识你,但是我知道你一定对算法竞赛充满热情和憧憬。

是的,热情。我在小学五年级的时候第一次接触编程。那时候凭一本很薄的VisualBasic 语言编程手册开始自学,是热情让我独立“啃下”深奥的手册,并且尝试写小游戏给全班同学玩。上中学以后,在教练老师的指导下,我开始系统地学习算法,也是热情让我放弃假期和周末,预习大学计算机专业的课程,天天在机房里面刷题、研究算法。面对有几千道题的题库,是热情才能让我支撑下来。

但是,只有热情是不够的。学习不能闭门造车,学习资源是否充足,对于竞赛准备来说十分重要。我很荣幸能在拥有丰富资源的顶尖中学里学习。当时国内算法竞赛刚刚起步,我的教练孔维玲老师和王晓光老师去国外的网站搜集学习资料,翻译成中文,用U盘复制给我们。我很清楚地记得,孔老师还打印了一张A4 纸交给我,上面密密麻麻地写满了50道动态规划算法的题目。这张纸对我来说就是“武林秘籍”,50道题引领我学会了动态规划算法。老师们还请已经保送清华的学长回来分享学习经验,给我们讲一些“黑科技”的新算法。这些对我的成长都至关重要。

现在,虽然网络非常便捷,但是学习资源依旧被强校垄断。竞赛中成绩斐然的中学和大学,有非常厉害的教练老师,有积累多年的题库资源,还有已经毕业的学长、学姐回来分享经验。而对于没有资源的初学者,入门会遇到各种困难。竞赛算法脉络繁多,知识点之间相互依赖、错综复杂,按照什么顺序学习?各种在线评测网站上的题目动辄上千条,怎么做题训练?每道题目是考查什么算法?对于我想学习的算法如何找到对应的练习题?而且,算法的知识梳理和题目的题解往往都源于热心同学的博客,有的语焉不详,有的只能针对特定问题,有的甚至还埋藏一些错误。对于初学者来说,难点不一定是找不到资料,而是找到好几份互相矛盾、写法不同的资料,不知道哪一份才是对的,也不知道正确的学习路线。

本书的初衷,就是不辜负每个读者的热情。我与李睿琦、娄兰两位老师根据北京大学附属中学和北京师范大学第二附属中学多年的竞赛授课经验,总结出合适的学习路线,并且配套例题和习题集,让读者能身临其境地感受强校训练的氛围。另外,我们不会故作高深,这本书语言力图做到通俗易懂,并且用100余张插图辅助读者理解算法。希望能够营造出与读者聊天的氛围,一步一步地分析问题。也希望读者在阅读的时候,跟着思考,并且不时地停下来看看自己能否想到下一步。自己想明白一道题,激动到像阿基米德一样喊出一句“尤里卡!”的时候,你会获得发自内心的成就感。

算法竞赛和体育竞赛一样,重要的是“训练”而不是“学习”。只看一遍,而不实际把程序写出来,是不能真正学会一个算法的。在之前很多介绍算法的著作上,都没有提供对应的在线做题环境,或者使用国外的、小众的在线评测网站,不方便提交。目前,算法竞赛领域最著名的在线评测网站之一就是洛谷,在本书成书之际,洛谷的总用户数刚刚突破100万人。非常感谢洛谷平台对本书的支持,书中所有例题和习题都可以直接在洛谷上提交评测。希望读者把每一道题都自己做一遍,同时通过评测进行验证,确保真正学会。

关于阅读本书的门槛,读者只需要具备一些基本的 C++语言编程知识和能力即可。一些略微复杂的语法知识,比如,结构体的构造函数和动态数组的用法,本书会展开介绍。不用有任何心理负担,跟我们一起出发吧!当然,由于我们面向刚刚起步的算法竞赛爱好者,所以一些概念我们不会给出非常学术化的定义和描述。如果有兴趣,可以以本书为路标,继续探索更深入的知识。

由于篇幅有限,本书只选择了一部分在算法竞赛入门阶段最为重要的基础数据结构和基础算法进行介绍,力求做到对于基础算法的各种变形全面覆盖,比如,介绍了动态规划算法的分组背包、二维费用背包等在其他著作中不太常见的算法,以及高精度计算中不太常见的除法取余算法,希望把这些只在传统强校中口口相传的“秘术”展现出来,避免读者在学习这些重要的基础算法时只能“蜻蜓点水”,知其然不知其所以然。

本书经过接近三年的修改与编辑,终于出版面世。非常感谢电子工业出版社的支持,感谢钱维扬编辑不厌其烦地修改语言问题,打磨细节。除了编著者外,本书部分章节由中国人民大学附属中学吴习哲编写,插图由北京化工大学王帆同学、首都师范大学梁爽同学绘制。也感谢对本书编写工作提供帮助和提出宝贵意见的老师们:北京市十一学校信息学竞赛教练汪星明老师、北京一零一中学信息学竞赛教练董华星老师、清华大学附属中学教练徐岩老师、北京师范大学第二附属中学信息学竞赛教练王析多老师、北京大学附属中学信息学教练杜昊老师。本书内容源于多年教学实践和教师交流,感谢北京大学附属中学信息中心毛华均老师,首都师范大学附属中学杨森林老师等前辈给予的无私奉献和大力推动,促进了北京算法竞赛的发展。感谢东北师范大学附属中学教练王晓光老师、孔维玲老师启蒙我的算法竞赛之路。

虽然几经删改和审阅,但是由于编著者水平有限,难免有不足和疏漏之处。如有错误或者意见,欢迎与编著者探讨,联系方式:微信公众号“信息学奥赛梁老师”。

希望本书不辜负每一份热情!

梁博