目录
前言
阶段一:还不熟悉至少一门编程语言,掌握的算法和数据结构较少(建议时长:4周)
语言的选择
语言的学习
学习网站
学习收获
做题量
阶段二:熟悉一门语言,需要进一步提高自己的算法水平(建议时长:8周)
刷题建议
推荐书籍
做题量
阶段三:已经有了基础算法和基础数据结构的能力,需要更多的进阶知识(建议时长:4个月以上)
学习资源
学习收获
竞赛训练
学习习惯
阶段四:已经熟悉大部分数据结构与算法,希望掌握更多高阶知识
什么是算法?程序 = 数据结构 + 算法。一个好的算法可以更高效率地解决问题
由于大家的算法水平不尽相同,所有需要根据每个人现阶段不同的能力来制定不同的学习计划。从下面选择一个你觉得自己目前的学习阶段(也可以根据你的做题量来选择):
怎么才算是熟悉一门编程语言呢?至少给你一篇题解,你要能够看懂,然后是会用
算法竞赛首选的编程语言是C++,其次是Python(也有部分Java选手,如果你目前还没有明确的编程语言选择,不推荐选Java)
C++之所以是首选语言是因为它有非常强大的库(STL),而Python的优点则是简单,易学,代码少。(C++还有一个不是它自身自带的优点,就是用C++的人很多,你可以很容能够以找到C++的题解,但是其它语言的题解并不一定有,简而言之就是C++的学习资源多)
学习程序设计竞赛不需要掌握一门语言全部的知识,因为程序设计竞赛追求的是代码少,效率高,像C++的类(面向对象)的知识,就是你不需要去学的,因为在竞赛中,你根本不需要设计一个类,用数组都能代替。那么竞赛究竟需要学习一门语言的哪些知识呢?
以C++为例,你只需要学习基础语法,和STL就够了,其中STL(standard template library)是重中之中,它为你提供了许多的算法,以及容器,当你需要某个算法或者数据结构的时候,你只需要把库中给你写好的拿过来用就行了。而Python则是containers模块,和一些好用的语法需要重点关注
语言的学习一定要和做题结合着来
如果只学语言,不做题那么你学的知识都是死的,不会真正的掌握,这个阶段可以做一些简单的题来锻炼自己的语言能力,这里给出做题网站:
[编程从零基础到进阶 - 编程题库 - C语言网 (dotcpp.com)]
PTA | 程序设计类实验辅助教学平台 (pintia.cn)
由于是初期阶段,难题肯定是不会做的,先做一些难度较低的题来锻炼自己的语言能力,如果不会写了,看题解即可
C++:
学习教程
C++入门教程,C++基础教程(更新完毕) (biancheng.net)
C++11教程:C++11新特性大汇总 (biancheng.net)
C++入门教程(配套编程题库) - C语言网 (dotcpp.com)
STL教程:C++ STL快速入门(非常详细) (biancheng.net)(重点)
参考手册
cplusplus.com/reference/
C++ 标准库标头 - cppreference.com
标准库标头 - cppreference.com
Python:
学习教程
Python基础教程,Python入门教程(非常详细) (biancheng.net)
参考手册
Python 语言参考手册 — Python 3.12.0 文档
网上好的教程还有资料有很多,这里不一一列举(也列举不完),可以找自己喜欢的看,看一两个就够了,也不用都学完,只用学需要学的就够了
学习语言是基础,是程序设计的前提,那么学完一门语言后能获得什么奖项呢?以我参加竞赛的经历来看,当你对一门语言掌握熟练后,能够熟练地写出代码,蓝桥杯省三是没问题的,因为省三真的很水,我参加蓝桥杯获得了省二,而且预估做出来的题不超过4道(总共10道题),所以省三/省二还是很简单的。只要你有一个语言基础就够了
这一阶段做题量大概不到50道。
其实语言的学习也可以是和算法和数据结构的学习结合着来的,就是你可以这样理解:学习语言就是在学习数据结构与算法,学习数据结构与算法也是学习语言的过程
这里推荐一个很好的算法与数据结构入门的教程(也是我入门算法的地方):数据结构与算法教程,数据结构C语言版教程! (biancheng.net)
这个网站有的教程是要收费的,当然我们没必要付费(没钱),去网上找这个知识点的其它教程就OK啦,这个教程的代码都是以C/C++为基础的,如果你是Python选手,可以先学思想,然后再在其它地方找代码实现。
后面可以看这个更难的教程:算法竞赛教程 - C语言网 (dotcpp.com)(先找好理解的看,看不懂的先跳过)
对基本的算法与数据结构有一个基本的了解后,接下来要做的就是大量的做题了,做题是一个锻炼自己思维和对已学知识强化理解的过程。这里推荐几个做题网站:
题库 - 力扣 (LeetCode) 全球极客挚爱的技术成长平台
题目列表 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
题库 - 蓝桥云课 (lanqiao.cn)
学习顺序可以按照这个流程图来:
这个阶段还是找相对简单,而且对算法和数据结构要求不高的题来做,锻炼编码能力
主要还是根据自己的能力来,有能力、有时间就多刷点。刷适合自己的题,怎么判断哪些是适合自己的题呢?
一个根本的判别标准就是它的难度:如果一个题你读完题之后很快就能想到思路,那就不要去刷它,浪费时间。反之,如果一个题你看完之后始终没有思路,想了半天、一天、甚至更多天还是没有思路,这说明这道题的难度显然不在你的能力范围之内,也就没有必要强求了,跳过它,等之后又思路了再来做。在LeetCode里面,这样的题会增加一个“尝试过”标签:可以筛选出来:
这些题就是你曾经试过但是当时没有做出来的题,可以以后再去解决。而在这两者难度之间(不简单,也不太难)的题就是你需要不断去做的题。
一定要有善于看题解的习惯,对于不会的题,一个最好的办法就是看题解,如果题解看不懂,可以换一篇。如果是知识点不知道,那就去查阅相关算法知识。
这一阶段我强烈建议购买算法竞赛的书籍,因为只有书籍可以带你系统地学习算法竞赛
这本书是所有的书里面最好的(上交大acm教练写的),如果不想买太多,可以只买这一套
其它书籍我不再做推荐了,有兴趣可以参考这个网站:学习资源 - OI Wiki (oi-wiki.org)
这一阶段推荐做题量在50~150道左右
从这一阶段开始,你就算是真正进入算法竞赛的“门”了。也是从这一阶段开始,你所需要做的就只是:找题 -> 做题 -> 找题 -> …,或者:找题 -> 遇到不会的问题 -> 学习 -> 找题 -> …不断地重复这个过程。听起来很枯燥,但是这是提升能力的最好途径。做题的过程也是积累新知识,提升思维的过程。
这里推荐一个知识点网站,非常全(其实不仅有知识点,还有学习指南)
OI Wiki - OI Wiki (oi-wiki.org)
有一个好的题单是必不可少的
题单广场 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
[kuangbin带你飞]专题1-23 - Virtual Judge (csgrandeur.cn)
能力全面提升综合题单 - 题单 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
每个题单的Part都对应一些知识,推荐有计划地去学和做(你可以选择两周做一个Part)
下面再给出这个阶段的学习路线图:
显然是做的题越多收获越大,这里给出一个刷题量和蓝桥杯奖项的大致对应关系:
200题 — 省二
400题 — 省一
600题 — 国三
1000题 — 国二
1500题以上 — 国一
注意:这里的题量是对应适合你的难度的刷题量,如果你一直做简单题,不做难题来拔高自己,那刷题量这个纸面数据也就没用了。
刷题是训练的过程,竞赛是检验的过程。推荐多去参加一些网站的在线竞赛来锻炼自己,也可以看到自己在全国或者全世界的rank。这里推荐两个,一个国内的一个国外的:(都是知名度较高的)
力扣竞赛:每周有周赛,每两周有双周赛:全球竞赛 - 力扣 (LeetCode) 全球极客挚爱的技术成长平台
CF:Codeforces(需要一定的英语水平,要不然看不懂题)
还有很多很好竞赛网站,比如牛客竞赛、AtCoder等等。找一个自己喜欢的,坚持下来是最重要的。
除了好的学习资源外,养成好的学习习惯也是必不可少的。好的学习习惯有哪些呢?
多去积累模板,积累模板是一个非常有意义的事情,它既是你学习的笔记,也是你比赛的工具(acm赛制可以拿来用)
多去和优秀的人交流,“他山之石,可以攻玉”,有时候你对一个问题没有好的思路,不如去请教大佬们。可以在网上找一些算法学习的交流群之类的
保持思考,学习算法是一个需要坚持的过程,你要有持续思考的习惯,这样你的思维能力才会有提升(就像你跑步需要锻炼一样),具体落实就是遇到难题了(能力范围内的)要坚持想下去
善于使用ChatGPT,对于大部分不懂的知识点,ChatGPT一般都能给出很好的讲解(代码能力可能不是很好,但是仍然非常推荐,这也是笔者一直在用的学习工具)
能达到这个阶段的人至少已经是全国排名前5%的人了。再往后其实就没有什么学习建议了,因为到了这个阶段的人已经对竞赛怎么学很熟悉了。
对于高阶知识的学习从来不是一件容易的事情,因为哪怕只是一个知识点都可能要花费你一周以上的时间去消化。大佬们的水平肯定比笔者要高(笔者其实水平并不高)。想要更高的成绩其实只是一个坚持时间长短的问题了,遇到难题不能放弃而是坚持把它想明白,这样才能突破瓶颈。
对于高阶知识的学习自然也需要更高阶的学习资源,其实上面已经列举过了(其中的比较难的知识就是高阶的知识)。继续努力地刷题吧~
最后附上一张自己整理的思维导图,全网最全!在文章顶部即可下载。