在互联网时代,最缺的就不是资源。随着IT行业逐渐热门起来,网上随处都可以找到所谓“编程入门”资源。劣质的资源混在其中,这加大了我们的筛选成本,导致我们在学习正式的编程知识之前,需要花费大量的时间精力来筛选资源。

本文档建立的初心在于帮助新手或正在入门编程但还很迷茫的同学收集优质的资源,以及给出优秀前辈们总结的学习经验。

本文按照程序设计语言入门、算法入门的步骤来推荐资料。资料主要分为书籍、视频、学习网站等类别。


入门C/C++语言

开始学习算法竞赛之前,你首先需要具备的能力是会使用电脑 一门编程语言。

如果你曾经学习过 Python、Java等程序设计语言,但是恰好没有学习过C或者C++,不用慌,没关系,你的编程基础会使你更快的掌握C/C++。同理,如果你学习过C/C++,那么在学习其他语言的时候也会更加轻松。

有同学可能会问:

$Q:$ 如果我只学过C(或者C++),还需要学C++(C)么?

$A$:需要,在入门阶段,这两者的差距较小,在后面的算法学习中这两者都会有应用。但要注意,算法竞赛不要求掌握过多的C++面向对象知识,同时也不需要纠结C语言中某些落后版本的规定(比如VC++6.0中的C98)。

接下来介绍一些初入门编程语言的学习资料:

  1. 书籍:

    • 初入门:C语言从入门到精通、C++从入门到精通、刘汝佳《算法竞赛入门经典(第2版)》(前面部分章节)
    • 精通:C primer plus、C++ primer plus(非必须掌握)
  2. 网络文档教程

    C语言中文网(文档型) (讲解很详细,有例子,笔者强推)

    菜鸟教程(文档型)

  3. 推荐视频

    中国大学MOOC浙大翁凯(火了很多年的慕课课程,如果B站链接失效,请告知QQ群内管理员)

  4. 在线编码教学:

    程序员慕课 (笔者入门时使用的网站,闯关式学习)

  5. 语法基础课 - AcWing (付费,Acwing全家桶系列之一,如果有条件可以考虑)

也许上面的资料就足够眼花缭乱,但是建议同学们在学习时要多重复,可以先随便选一个资料去入门,并配合 CHDOJ题单 进行练习,如果有细节问题,可以在参考其他资料。

另外,不要寄希望于只看一次就学会它,它值得你在之后不断的重复学习。


Online Judge 的使用方法

Online Judge 系统(简称 OJ )是一个在线的判题系统。用户可以在线提交程序多种程序(如C、C++、 Pascal)源代码 ,系统对源代码进行编译和执行,并通过预先设计的测试数据来检验程序源代码的正确性。

简单来讲,它可以验证你的代码是否正确。如果OJ返回了 Accepted ,那么恭喜你,你的程序通过了测试。

他是我们学习编程的有力工具。

  • Accepted : 程序通过!

  • Pending : 系统忙,你的答案在排队等待.

  • Pending Rejudge: 因为数据更新或其他原因,系统将重新判你的答案.

  • Compiling : 正在编译.
  • Running & Judging: 正在运行和判断.
  • Presentation Error : 答案基本正确,但是格式不对。
  • Wrong Answer : 答案不对,仅仅通过样例数据的测试并不一定是正确答案,一定还有你没想到的地方.
  • Time Limit Exceeded : 运行超出时间限制,检查下是否有死循环,或者应该有更快的计算方法。
  • Memory Limit Exceeded : 超出内存限制,数据可能需要压缩,检查内存是否有泄露。
  • Output Limit Exceeded : 输出超过限制,你的输出比正确答案长了两倍.
  • Runtime Error : 运行时错误,非法的内存访问,数组越界,指针漂移,调用禁用的系统函数。请点击后获得详细输出。
  • Compile Error: 编译错误,请点击后获得编译器的详细输出。

而只有AC(Accepted),这道题才算完全通过。凡是出现PE,WA,TLE,MLE,RE,CE,都要做出调整,否则此题不算通过。

至此,你可以通过以下练习来更加深入的了解OJ的使用: A+B练习


启程算法之旅

推荐书籍

  1. 入门

    • 啊哈磊《啊哈算法》
      • 启蒙书,只适合用来入门
    • 巫泽俊 《挑战程序设计竞赛(第2版)》
    • 刘汝佳《算法竞赛入门经典(第2版)》
      • 适合搭配其他书使用,该书并不适合单纯入门,但是书中有些讲解非常凝练精干,适合后期攻克专题时使用。
    • 陈小玉《算法训练营 入门篇》

      • 21 年新出的书,内容很全并且图很多(图多更好理解,入门者的福音)
  1. 进阶

    • 李煜东 《算法竞赛 进阶指南》(笔者进阶时使用的主力书)

    • 刘汝佳《算法竞赛 入门经典 训练指南》

    • 陈小玉《算法训练营 提高篇》

      • 同样是 2021 年新书,图很多

最后,是笔者收集的一些算法的电子书,可以自行下载。

链接:百度网盘 密码:yyew

图片5.png

推荐网站:

  1. CHDOJ 由长安大学ACM协会维护运营,有适合初学编程语言以及算法入门的练习题,以及长安大学历年新生赛和校赛的题目。CHDOJ 2021-07-26 下午5.38

  2. 洛谷OJ 主要面向OI选手(中学生信息竞赛)。有着非常友好的界面以及丰富的国内外OI题库。

  3. Virtual Judge 并非真实的OJ,它并不提供评测服务,只是将你提交的代码送到各个OJ评测,然后抓取评测结果返回给你。也是CHDACM协会以及集训队训练的主要平台之一。

  4. CF (Code Forces) 俄罗斯OJ,始于2010年,一直以来都是非常热门的OJ,几乎每周都会有比赛,适合全阶段选手练习。
  5. Acwing NOI金牌保送北大选手闫雪灿创办的OJ。有极为优质的学习资源(包含付费),社区也很完善,你可以在上面找到志同道合的伙伴。
  6. 题库丰富的学校运营OJ
    • HDU(杭电运营)
    • POJ(北大运营)
    • ZOJ(浙大运营)

更多学习资源请参考:学习资源 - OI Wiki (oi-wiki.org)

另外,我们也推荐同学们去知乎、博客园、CSDN等程序员较为活跃的社区,从那里你或许可以找到有用的经验知识。


结语

也许你们曾经听过,最好的学习方法是讲给别人听,不断地重复将会使你的理解更加深刻,记忆更加牢固。因此,非常推荐当同学们有所收获时,将其记录下来,如果可以,尝试凝练一下语言,提炼一下知识点和易错点,发表到博客上,可以帮助在算法学习路上的其他人。

这里是一些学长们的博客,供大家参考:友情链接

最后,笔者想说:

或许你是一个新人,面对英文网站时瑟瑟发抖,在群里大佬们侃侃而谈时默默窥屏,想要入门但又不知如何起步,遇到困难也找不到人求助,经过一番内心针扎后也不敢点开私聊框向大佬发起询问,害怕得不到回应或者被嫌弃。

我曾经也是这样的,由于高中到大学的转变,不再有人催促着自己学习,尽管非常想踏进算法的大门,但却被现实狠狠的打击。是的,算法竞赛门槛很高,绝大部分的内容大学课堂上并不会涉及,ICPC更是被称为计算机界的奥林匹克竞赛,难度可想而知。

也许在未来,你会受到很多挫折,每天背着沉重的电脑奔波在图书馆自习室,一个难题磕了一整个下午也不会,十几到几十次的提交,红橙相伴永不见绿。你会怀疑自己为什么别人十分钟可以AC的题自己五个小时也做不出,你会抱怨为什么队友整天都在搞别的从不来训练。那么我们究竟是为了什么,要下决心去参加算法竞赛?

也许,只是为了热爱。

也许你已经知道了ACM在IT界的光环,它可以帮助你在拿奖学金、保研、考研以及找工作时有一定优势,但是如果目的仅仅是这些,那ACM的性价比将会非常的低。因为有更多的竞赛以及手段,可以达到这个目的。

我在2019年秦皇岛冬令营时,第一天的比赛非常难,罚坐五小时只做出来一个题,当全场同学都在抱怨时,qls(北师大ACM退役选手,冬令营赛题出题人)在群里告诫大家:”题可以不会做,思考不能停”。题做不出来很难受,但是竞技比赛,魅力在于拼搏的过程,只有经历过这种感受,才能体会 Accepted 的快乐。

在之后的比赛中,排名由最初的130多进步到32。(Div2 共有150支左右的队伍)

”1%的时间用来学习,99%的时间用来刷题“,wls(上交退役选手,多次举办公益Camp)这样讲。新知识的学习只会占一小部分,大部分的时间用来练习。

也可能有人会反驳,这不是妥妥的刷题机器吗?当参加算法竞赛成为你获得利益的一种手段时,确实是这样。竞技比赛不同于普通的考试,就像奥运会一样,运动员不停的训练不仅仅是为了奖牌,而是为了展现一种精神。

最后,希望入门指南能够在你的算法编程学习旅程上提供一点帮助。如果你还想了解更多,可以再看看协会创始人——李韡学长(2012级)毕业时写下的入门指南

噗,忘记自我介绍了,我是17级信息学院计科专业的韩耀东,大一升大二的暑假开始入门ACM,在学习ACM的旅途中经历过很多困难,也遇到过惊喜,希望我写的这一篇入门指南可以帮助到大家。