从学编程到保送北大 | OI (信息学奥林匹克)竞赛亲历

网友投稿 2019-06-21 11:20

https://cdn.china-scratch.com/timg/190623/1120444119-0.jpg

听说奥林匹克数学、物理、化学等竞赛慢慢“没用”之后,信息学奥林匹克是最时兴的啦……


听说NOIP/NOI/OI 是现在中小学生家长群里火爆得不得了的名词,打完这些比赛可以名牌大学呐……


听说人工智能时代来了,中小学生都要学编程了呢,学完编程是不是就都可以去打竞赛啦?……

这些都是真的吗?我们来听听亲历者怎么说——

https://cdn.china-scratch.com/timg/190623/1120443324-1.jpg

作者莫成娴:从初中开始参加NOIP/NOI,以优异的竞赛成绩被保送到北京大学计算机系学习。

本文从直观角度讲解信息竞赛的内容、赛制和赛程;分享作者个人训练和参赛经历;并为有意加入者提出中肯的建议!

信息学奥林匹克

https://cdn.china-scratch.com/timg/190623/11204450D-2.jpg

OI/IOI/NOI/NOIP

让我们先来了解几个术语:

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

全国青少年信息学奥林匹克竞赛 (National Olympiad in Informatics, NOI):是中国计算机学会主办的,主要面向全国中学生的每年一度的信息学学科奥林匹克竞赛。

全国青少年信息学奥林匹克联赛(National Olympiad in Informatics in Provinces,NOIP): 是中国计算机学会主办的,一项面向全国青少年的信息学竞赛和普及活动。

https://cdn.china-scratch.com/timg/190623/1120452I6-3.jpg

简单而言,NOIP是省级的,NOI是全国的,IOI是世界的。这三者之间,可以看成一个等级递进的过程,有点像体育竞赛的省级比赛,全国比赛和奥运会。

有时候,也会使用“信息学奥林匹克竞赛(Olympiad in Informatics,OI)” 这个说法,用来泛指上述三者。

对于OI而言,要从NOIP打起,打好了,就有可能被选入省队,然后去打NOI。NOI成绩好,才有可能去打IOI。

NOIP的 “江湖地位” 

我们可以把NOIP理解成分为初中和高中两个阶段的编程竞赛。

其高中部分和数学联赛、生物联赛、物理联赛,以及化学联赛都是属于高中阶段的五大联赛

https://cdn.china-scratch.com/timg/190623/1120454c4-4.jpg

五大联赛流程是比较相似的,同样都是比完联赛之后各省会进行省队选拔,然后去参加全国竞赛。

NOIP的初赛和复赛

年龄组

NOIP分为两个年龄组:普及组和提高组。原则上初中生参加普及组比赛,高中生参加提高组的比赛。

但是由于有些省份的部分学校实力比较强,有好的教练,所以可能会出现有初中生参加提高组的比赛的情况。

甚至曾经出现过比较牛的初中生,直接参加提高组比赛后就经过省选,进入了省队,最后在全国(竞)赛拿到了好成绩,并提前获得保送的情况。

赛程

NOIP的赛程分为初赛和复赛。

一般在每年的10月左右会有一次初赛,然后根据初赛成绩有一部分同学可以进入复赛。

初赛的形式是纯粹笔试,不会有任何上机考试。内容除了算法和编程,还包括一些计算机的基础知识。

比如有一道非常经典的选择题问:防火墙的作用是什么?四个选项里会有“防止火灾”的选项,肯定不能选。

https://cdn.china-scratch.com/timg/190623/1120453T4-5.jpg

通过初赛后就会进入复赛。

NOIP的复赛,不管是普及组还是提高组都提供上机考试

我们那个时候的规程是有三四道题,需要在电脑上完成对应的编程工作。每一道题都是给定一种输入格式,要求参赛者解决这个问题以后按照指定的输出格式给出答案。

评测的方式是用一个测试数据的集合,有测试系统用这些测试数据来跑参赛代码,然后判断输出的数据是否正确,依次为据进行打分。

https://cdn.china-scratch.com/timg/190623/11204B133-6.jpg

目前赛程可能有点改变,现在的提高组应该是分为两试,这些变化,大家可以去官网查询或者向竞赛教练、培训机构询问。

NOIP - NOI - IOI

如果在NOIP提高组的复赛当中获得了比较好的成绩,就可以参加各省的省队选拔。

省队选拔的政策,各省并不完全一样。有的省主要是看选手提高组复赛的成绩;有的省会再配合一些其他的其他的选拔赛事……这些要看各省的安排。

最终每个省会选出一个省队,进入全国赛(NOI)。

https://cdn.china-scratch.com/timg/190623/11204L603-7.jpg

在NOI获得奖的前x名(我们那时候是前6名,不过具体多少名每年都可能有变化,请大家关注实时数据),会进入全国集训队。

集训队内会再一次进行选拔,选出最优秀的部分选手,进行一次的现场答辩。通过答辩再优中选优,进入世界总决赛(IOI)。

当然能参加IOI的人非常的少,我也没有参加过,但还是被保送上北大了。下面我就来讲讲我个人的竞赛经历

个人经历

https://cdn.china-scratch.com/timg/190623/11204G610-8.jpg

初中

我是从初一下学期开始开始学习编程和计算机知识的。并且在接下来的那次初赛当中挺意外地获得了还可以的成绩,就这样进了复赛。

那次复赛我参加的是普及组的比赛,直接获得了一等奖。

https://cdn.china-scratch.com/timg/190623/11204J410-9.jpg

回想一下,当时我们初中的教练确实很厉害,不但教得好,还帮我们提前报名了一些省选之类的比赛。那些比赛虽然我们的成绩不列入排名,但是可以去提前体验一下。

于是我在初三的时候就跟着高中的学长学姐们去参加了提高组的培训和比赛的。

高中

刚上高中时,我的心态不是很稳定。所以一开始考得并不好。

高中最关键的一场比赛——也就是高二秋季的那场复赛,我的成绩非常不好,当时就想:“肯定没戏了”。

结果最后省选一试直接拿了全省第三,成功的进入了全国赛。

保送之前

我们那一年也很巧,刚好是北大和清华都有一点抢信息学人才的意思。他们都提前办了夏令营,把全国赛的选手集中到夏令营里面,单独考试。如果能考到前几名,不管最后全国赛成绩如何,都可以保送。

https://cdn.china-scratch.com/timg/190623/11204I917-10.jpg

我因为入选了全国赛的集训,也就参加了北大举办的夏令营。当时一共有四十几个人参加,考试选拔二十名。我挺巧的考了个第十七名,就成功的进入了北大。

我的成绩确实不够稳定,最后全国赛只拿了三等奖。但是由于已经提前拿了保送,全国赛成绩不佳也没关系了。

大学期间

上了大学以后,我读的是计算机系。班里的同学绝大部分都是普通高考上来的。竞赛选手和普通高考的学生其实也没有什么特别的不同。

https://cdn.china-scratch.com/timg/190623/11204RW0-11.jpg

刚开始的时候,我们搞过竞赛的几个同学,计算机知识有基础,部分课程可以免修。再到后来,就没什么差别了。

或者说,后来的差别主要还是看个人是否努力,是否好好上课,是否主动做项目之类的,和是否高考,是否打过竞赛就没什么关系了。

毕业工作

有个很有意思的现象,就是我们系,我们这一届一路搞竞赛上来的同学,都在本科结束之后选择直接进入一家比较好的计算机企业工作,而没有选择读研。

不过观察到的也就几个人,这是否是一般规律就不知道了。 

谨慎选择竞赛之路

https://cdn.china-scratch.com/timg/190623/11204WA1-12.jpg

OI赛程的特殊之处

虽然同属五大联赛,但是信息学奥林比克的比赛时间和其他四个联赛不一样的。

NOIP的初赛是在秋季,NOI是在次年的春季到夏季之间。这意味着一个问题:如果要争取保送,OI得比其他竞赛早一个学期得奖。

https://cdn.china-scratch.com/timg/190623/1120493N7-13.jpg

有人曾经问我:“到了高二中旬的时候去参加NOIP还来不来得及?可不可能获得保送资格?“

我告诉他:”那是肯定来不及的。如果高二再参加NOIP,那么接下来参加第一次省选就已经是高三的秋季了。等到NOI正式正是举行,就已经是高三下学期,要高考的时候了。”

所以要想保送,至少得保证NOIP在高一就参加。

竞赛与学业

打信息竞赛的学生和家长都会面临一个问题:如何平衡竞赛和学业?

初中的时候学业相对轻一点,可能还好。一旦进入高中,势必要面临选择,到底是靠打竞赛保送,还是回来高考?

毕竟,五大联赛里面,只有信息竞赛无法直接对课业成绩有好处的。

https://cdn.china-scratch.com/timg/190623/1120493T3-14.jpg

如果要集中精力搞竞赛,必然要停课一段时间,去集中精力训练,这是没有办法的。这时就要考虑清楚:你最到底能够在这个项目上投入多少时间?如果最后真的失败了,结果你可以接受吗?到时候,你是否还有时间去追上别人,参见普通高考?

如果到了高一还觉得自己的编程技术非常的薄弱,其他方面的功课又没有把握在停滞一段时间后能够赶上去的话,可能就要考虑提前放弃了。

竞赛之路多艰难

信息竞赛的放弃率确实非常高。

当年我们初中刚开始接触OI的时候,我们这届有20个左右的同学在学习,但最后完成了竞赛全过程,一直走到大学的,算上我也只剩下两个人了。

https://cdn.china-scratch.com/timg/190623/11204964G-15.jpg

信息竞赛来自老师和家长的压力会比较大,特别是有些老师会跟家长说:这个竞赛是没有用的,会影响成绩等等。很多家长就会害怕,让孩子提前放弃OI。

竞赛影响学业吗?

对于信息竞赛是否影响学业这件事,我觉得只要平衡好,其实不会影响学业。

不过有一种非常忌讳的情况:放弃一切只去打比赛!

https://cdn.china-scratch.com/timg/190623/11204953A-16.jpg

我们知道有的地方,有些学校,他们会把打竞赛的学生集中起来,进入高中以后就不上正常的文化课了,只是一门心思搞编程竞赛。

这样的同学,连高中的主课都没有学完。如果拼到最后失败了,那就算再去高考,考好的可能性也不高了。

所以我非常反对搞这种百分之百投入竞赛的行为,这样做非常危险!

学有余力打竞赛

学业和竞赛可以平衡发展,前提是学有余力。

先把中学讲授的基础知识都学好,用业余时间去学习竞赛的内容。在比赛以前稍微停一下课,去集中训练,实际上是足够的,完全没有必要极端操作。

https://cdn.china-scratch.com/timg/190623/112049C11-17.jpg

正常情况是平时正常学习,平时用娱乐、休息的时间进行竞赛日常训练,只是在竞赛前夕集中训练,是不会影响到学业的。

和我从初中开始同期学习,后来又放弃了竞赛的那些同学,他们离开信息竞赛之后也都正常学习,后来正常高考。并没有导致任何不良后果。

考虑清楚再入手

当然,无论如何,大的比赛前集中训练会占用正常学习的时间。

选手需要考虑清楚:这个时间用来集训了,但是最后失败,你能不能接受最坏的结果?你还能拼回来吗?

如果代价是你不可承受的,那真的不建议你去冲击竞赛,还不如正常学习。

https://cdn.china-scratch.com/timg/190623/11205013C-18.jpg

比如我的例子吧,我高二那场联赛成绩不好。我还要不要继续打下面的省选赛呢?、

如果打,就要用继续集训。万一省选再比得不好的话,进不了省队,就等于之前总共花费在集训上的半个学期的时间都白费了。

但是我最终还是选择了继续打省选,是因为我有自信:即使省选失败了,那么省选后的几个月再加上高三那一年,有这段时间拼高考,我不会输给别人太多,至少上个浙大没问题(我家在杭州)。

也就是说,这个精力投下去,最坏情况至少还能保住浙大,所以我觉得就可以再拼一下。

于是我又很拼了一段时间,省选考得好,后面又有了夏令营机会,终于保送了北大。

竞赛选手有优势

打竞赛有很多付出和风险,但是也有好处。

比如像我这样,初一开始学编程,一直坚持下来,大学学的计算机,工作也是在计算机企业,那么就我比别人多了很多年的实践经验。

别人可能进大学以后才开始学习编程,那个时候,我已经写了好几年代码。别的不说,至少手也比人家熟。还有些课程可以直接免修,就有时间在大学里去学很多其他的东西。 

https://cdn.china-scratch.com/timg/190623/1120505H6-19.jpg

Q1信息竞赛有教材吗?

A1:有这些推荐书目:

《算法竞赛入门经典训练指南》:https://book.douban.com/subject/20254543/

《算法竞赛入门经典》 :https://book.douban.com/subject/25902102/

《算法导论》 :https://book.douban.com/subject/20432061/

https://cdn.china-scratch.com/timg/190623/1120505209-20.jpg


Q2信息竞赛有专门的培训班吗?

A2:各个省市的情况不同。有些学校(中学)有专门的教练培训;有些地方会在注入少年宫之类的地方,会相应的兴趣班。

中学的教练和兴趣班的老师应该是都可以帮忙报名的,如果个人参赛也可以找他们咨询一下。

也有一些商业培训机构、培训班,如果他们真的有竞赛训练条件的话也可以考虑参加。

https://cdn.china-scratch.com/timg/190623/1120505P1-21.jpg

不过如果是那种种“几天精通某某语言”的培训班,恐怕挺不靠谱的。

一般短期培训班,搞竞赛很难。现在外面的这种培训班良莠不齐,鱼目混珠的情况很严重,不太建议报这种纯商业目的的竞赛班。


Q3小学生能参加NOIP竞赛吗?

A3:我们那个时候小学生不能参加,不过后来也有听说有小学五六年级就开始参加普及组的。这个可能各个省市不同,具体信息建议到当地的学校或者培训机构咨询一下。

我觉得初中开始学会相对好一点,小学稍微早了一点。


Q4OI竞赛可以自学吗?

A4:靠自学太难了,这个恐怕要是天才中天才才行。

一般出成绩的选手,都有好教练给进行系统的训练,长期大量的训练才行。

https://cdn.china-scratch.com/timg/190623/1120513H6-22.jpg

如果你真想要自学,建议去大学里旁听计算机专业课程,可能会好一点。


Q5OI用什么编程语言? 

A5:我们那时候初中开始学的是PASCAL,不过近期的参考书很多都是C++的了。C++入手比较难,也有些人现在学Python。

我们初中入门用PASCAL,到高二左右就是再重新学了C++。转语言的成本不高。当你通过学前面一个语言建立了编程思维,以后转到另外一个语言其实挺容易的。

https://cdn.china-scratch.com/timg/190623/1120515Q1-23.jpg

所以可以考虑先从比较简单的语言入手,然后再转成C++。这样对以后的学业、工作都有好处。


Q6请问你怎么看待少儿编程?

A6:现在的很多“少儿编程入门”与其说是编程入门,不如说是培养小孩子的兴趣,让他们觉得这个东西有意思。

特别是像那个Scratch,它其实不是一种编程语言,以后也没法用。

那就是一个少儿编程工具,好处是使用者可以不用认识英文单词,可以不用会键盘,就拖拖拽拽就可以,有点像给小孩子的一个玩具。那并不能算是正式的编程。

https://cdn.china-scratch.com/timg/190623/1120512936-24.jpg

如果考虑是要走竞赛方向的话,肯定还是要正式学竞赛对应几门语言的,这么简单的东西不行。


Q7通过网络课程学编程可行吗?

A7:网课我是真不熟。

有一些网站,上面可以提和编程有关的问题,然后有人去回答,或者是有一些技术博客介绍各种新技术的,在我们工作中用来学习很实用,方便有效。不过对小学初中升不太合适。

https://cdn.china-scratch.com/timg/190623/1120512258-25.jpg

现在网课日新月异,变化非常大。具体到一个平台、一门课,建议去网上搜一搜它的口碑,百度、知乎上都行。

或者买一些畅销书看也可以,基本上排名前几的质量都还是不错的。


https://cdn.china-scratch.com/timg/190623/1120523C2-26.jpg


“渔文狩艺”愿景

亲子共学,知识共享 —— 本社群希望集合志同道合的朋友,根据自己的爱好和所长,为孩子提供课外学习的资料和指导,并一起分享、讨论教育话题。共同努力,把家长自己变成孩子的优质教育资源!


更多“渔文狩艺社群”活动,欢迎关注社群公众号

--end--

声明:本文章由网友投稿作为教育分享用途,如有侵权原作者可通过邮件及时和我们联系删除:freemanzk@qq.com