从OI谈起
提到OI,也许很多人并不清楚这是怎么一回事。对于在学校就学习过数学、物理、化学和生物的同学们来说,“国际五项学科奥林匹克竞赛”中的这四门是相当熟悉了(相对OI来说)。而OI/信竞/计算机竞赛又是什么?听名字跟计算机有关,他们不会是修电脑的吧!
差不多是这种“实际”问题
可见,OI题目的实际考察内容还是知识本身,正如理化生竞赛要考察大学知识一样,OI的主要内容同样是大学中的有关内容(中学有什么算法知识吗[捂脸])。相对来说,OI对于编程语言本身的掌握要求就很浅。总的来说,OI的题目更偏重理论和数学层面。
OI竞赛的形式也独树一帜,你需要根据题目的要求写一段程序,评测并不是有人盯着代码一行一行看,而是采用黑箱测试,共有多组数据,每组输入数据后只要在规定时间内输出正确结果就算通过,最后根据所有数据的情况确定分数,可以说没有任何主观因素的影响。
THE SECOND
关于OI的特点
OI有很多比赛,其中较关键的两项为全国青少年信息学奥林匹克联赛(National Olympiad in Informatics in Provinces,简称NOIP、联赛)和全国青少年信息学奥林匹克竞赛(National Olympiad in Informatics简称NOI、竞赛)。NOIP相当于省赛,由全国统一命题,各省自定分数线;NOI则是全国赛,会分出金银铜牌和集训队
OI作为编程竞赛,自然对编程能力有着一定的要求,但这并不是什么很高的门槛。对于初学者来说主要有两大难题:一是编程思维,二是经验与习惯问题,这都是可以通过做题解决的,毕竟OI又不是工程开发。除去写代码的部分,OI与数竞有很多相似之处(因此同时搞数竞和OI也是可以相互促进的选择)。OI的知识点不多,更多考察的是掌握理解、问题分析,甚至是临场应变的能力。某位老师曾说过:“竞赛是智者的游戏。”但其实在OI中,除去少部分智商碾压的大牛,通过勤奋积极而有效的学习同样可以取得理想的成绩。
NOI系列赛事是在激烈的高考竞争下升学的一条捷径。如果在清北的冬/夏令营中发挥不错或NOI等比赛中取得较好的成绩,就可以拿到相应的降分。在NOI中拿到银牌,就可以签到复交等学校的一本线。即使重心不放在OI上,拿到NOIP省一的性价比也是很高的,毕竟省一是诸多学校自招的敲门砖,而双省一的价值也远远超出单科省一,而目前在本省拿到OI省一的难度是远小于别的竞赛的。
某位不愿透露姓名的hzy学长就曾经在拿下OI省一之后顺便进了个CPhO国家集训队
参与OI不仅能为升学助力,还能极大地提升计算机水平。也许之前你是一个电脑小白,但在经过OI的学习后,你也许已经对计算机的原理有所了解,你也可能熟练地掌握编程技能,你以后还可以在大学的相关课程上刷分。毕竟在现在,编程是几乎很多学科都绕不过去、离不开的。如果你打算进入EECS方向学习,OI基础更会让你受益匪浅。而且,OI中锻炼的严谨的逻辑思维能力无论在高考、竞赛还是在日后的学习中都相当重要。
THE THIRD
关于OIer的能力
学习OI的过程,除了具体知识点,就是一个不断做题的过程,从在线题库、模拟赛到真正的比赛,你将一直和题打交道。但学习计算机竞赛也是一种“应试教育”,毕竟大家直接的目的还是在赛场上考到高分,而临场发挥是相当重要的。因此,OI需要重点练习三个方面:
1. 对知识的掌握和对题目的分析能力。OI涉及到许多种算法和数据结构,理解其原理、实现和有关技巧是每名OIer的基本功。但是OI赛场上极少出现“裸题”,也就是直接使用某种方法就能做出的题,更多的题需要深刻的理解和巧妙的思路,运用某些算法和数据结构作为工具来完成。如果你没有超高的智商,那么不得不说这是离不开大量的刷题的,有了大量的做题经验后,一来你对很多算法的理解更深刻了,二来你解构题目运用算法的能力也会更强。
2. 代码能力。代码能力说白了就是把想法实现为具体代码的能力。代码能力的强弱直接制约着一名选手的水平,因为OI比赛中时间是非常宝贵的。提升代码能力同样没有什么捷径,只有不断去写一些看似很麻烦的题才能逐渐提高。
3. 临场发挥的能力。OI的赛制为每场5个小时(NOIP为3个半小时),3道题,每道题根据不同的做法有不同的部分分,NOI、NOIP均为2场(冬令营、APIO等为1场),最终计算总分。每一道题都要经过读题,想做法,代码实现,调试和最终的对拍,由于分数高的做法较为困难,每道题往往还要写n>=2种做法用来保底。因此看上去漫长的5(3.5)个小时其实是不太够用的。如何分配时间、高效地测试,都要在一场场的模拟赛中逐渐掌握。
THE FOURTH
几条建议
上面已经很多次提到,学习OI没有什么捷径,但是却有可能绕弯路。投入大量时间、精力却收不到成效,的确是一件很让人苦恼的问题。因此,这里有几条小小的建议:
1.一定要高效地做题。高效不是指速度快,而是指有收获,比如做完这道题能让我熟悉这个算法的模板,或者能让我有一些新的思路,或者能提升代码能力。总之一句话,不做无意义的题。
2.正视模拟赛,把每一场模拟赛当作正式比赛来打。这不是什么态度问题,而是真的只有这样才能锻炼自己分配时间、写部分分、对拍等能力。
3.学会调整心态。在赛场外,你可能因为训练影响文化课学习而焦虑,可能为怎么努力也赶不上一些大神而苦恼。在赛场内,你也可能因为一两道题导致心态爆炸,比赛崩盘。不是一切都会顺利,你需要一颗大心脏。
4.及时确立高中规划。具体到OI上,就是要不要把重心放在OI上,要不要停课,什么时候停。这需要你对自身的实力有着清晰的了解。切忌两头放不下,最终不论竞赛还是高考都不尽如人意。
5.如果最终的成绩还是不理想,没有关系,这只是漫长人生中一个微不足道的小插曲,你的眼前还有一片更广阔的天地。