距离大一入学已经经过了两年半的时间,离我第一次接触C语言也过去了两年半。向王瑞洲(以下简称GodWang)请教字符串的读入、01背包的情景还历历在目,弹指一挥间,如今已是大三。
在高考结束的时候,莫名其妙的只想填计算机类的专业,也许是出于对编程的好奇,又或许是觉得会编程的人特别帅。在纠结了很久是选择计算机还是软件工程之后,我决定选择软件工程,因为我对硬件方面没有太大的兴趣。就这样,我和爸爸妈妈将全国带有软件工程专业的学校都找了出来,寻找自己能去的地方。最后,我来到了这里——浙江财经大学信息学院。
大一入学第一天晚上,张帅老师和其他另外几个老师就来我们的寝室,和我们讲了很多大学生活学习上的事,提及了ACM,那应该是我第一次听到ACM这个名词。那时的我,只是一个萌新,只听到这是一个超级厉害的编程竞赛、训练很辛苦,在我的脑中也只是短暂的停留,并没有太多的留意。那天晚上,倒是我会变魔术的事情被老师们知道了,在军训中、一元钱活动以及新加坡学生访问我们学院的时候,老师就让我上去表演魔术。
大一军训结束,开始正式的大学生活。其中有一门《C语言程序设计基础》的课程,是陈老师给我们班上的。在课后,老师总是会在学校OJ上布置一些作业,那也是我第一次知道了OJ这种系统。国庆回家,第一次做作业就遇到了斐波那契数列,至今我还清晰的记得,第一次写斐波那契数列,向厉伟键学长和沈雯学姐求助,整整花了4个小时,在经历了无数的Wrong Answer之后,终于Accepted了,在获得Accepted的那一个瞬间,心情简直是激动无比的。
因为陈老师是ACM队的教练,所以在上课的时候,经常会给我们看学长们参加ACM亚洲区域赛的排行榜,也经常给我们讲关于ACM的起源、发展以及奖牌的含金量。正是在那节课上,我第一次深入了解了程序设计竞赛。那个时候,我大概就正真地被这比赛吸引了吧。于是,我在心中下定了决心要参加ACM训练,每周末我都会去老师安排的机房训练进行学习,也会在校OJ上疯狂的刷题来熟练C语言的语法。刷OJ是疯狂的,因为有系统中有Ranklist的界面,总想要看到自己的排名往上爬,然而这只能通过自己的努力来达到。那段时光中,我大概每天6:00多起床,晚上10:00上床睡觉,可以说是没日没夜地在那做题。
大一飞快地学习过程中, GodWang帮助了我很多,他在高中获得了noip一等奖,因此这些简单的语法对他来说简直就是小菜一碟。那时,我什么都不会,经常去他寝室问他问题,幸运的是,他很愿意帮助我。在我学习语法的过程中,陈老师和GodWang成为了我的启蒙老师。对于我来说,这一切真的很幸运,能遇到ACM教练给我们上课,能遇到优秀的同学协助我学习,是可遇而不可求的。
看到陈老师发布了蓝桥杯选拔的消息,我并没有在意,因为我想我那时什么都不会,去比赛只能垫垫底,就没有去参加蓝桥杯选拔赛,但是最后陈老师给了我一个参赛名额。
听说有ACM院赛,我欣然报名参加了,不幸的是,那次比赛我只通过了3题,排名很靠后,只拿到三等奖,完全打崩了。那是我第一次参加比赛,比赛打崩的原因有很多:有一些题目的数据水了,导致其他人用错误的方法通过这题,而我知道这种方法是错误的,就没有提交,还有就是比赛经验不足,不会跟榜。比赛结束后,很沮丧,天空又下着大雨,心情顿时就像高考落榜一般,觉得很对不起陈老师给的那个蓝桥杯参赛名额,毕竟有很多院赛排名比我靠前的同学没有参赛名额。
在大一上期末的时候,我在OJ上刷了498题,大一上就这样过去了。
寒假,我参加了3天的集训,老师说搜索很重要,是ACM入门基础,回家之后我开始自学搜索(dfs、bfs)。回到家的那天晚上,我翻开了课本,一行一行的看“骨头的诱惑”的代码,终于在debug功能下,我初步理解了递归。陈老师给我们准备了两个搜索专题,大概40多道题目。那段时间里,每天早上第一件事情不再是打开QQ,而是打开hust上老师挂的专题开始刷。我还记得,大年三十那天白天通过了那一年最后一个题。整一个寒假学习了搜索,以及一些简单的结构体语法、STL等,对动态规划略有涉足。
大一下开学,GodWang问我寒假学了什么,我说只学会了搜索,然后他建议我去学一些树状数组、并查集、RMQ编码量较小的数据结构,并且建议我去开通一个博客用来记录自己通过的题目的代码以及题解。因此,大一下开学那段时间,我学了树状数组、并查集等内容,也开通了博客www.ZhouZhentao.com,从开博客那天到今天,所有AC的代码我都记录了下来。
之后,陈老师进行了浙江省大学生程序设计竞赛的组队,很幸运,我和GodWang还有天棋学长组到了一起,我们队伍一直组到了今年的区域赛结束。两个队友都比我厉害很多很多,我是队内最菜的。在大一下省赛训练的那段时光里,看着他们写代码,我学到了很多编程技巧。
蓝桥杯省赛,我们去了浙江传媒学院比赛,那是我第一次出校门去比赛,很紧张。最终比赛结果出来的时候,简直高兴地不得了,第一次出门比赛就拿到了一等奖,虽然B组比赛很水很简单,但这是第一次,而且拿到一等奖意味着可以去北京大学参加全国决赛。还记得,大一的同学中是我和GodWang还有xiang578拿到了蓝桥杯省赛一等奖。
在省赛中,我跟着强劲的队友获得了金牌。
第一次去北京,第一次出省,第一次在火车上过夜……这一切对我来说都感到很新奇,到达了北京之后,我们去参观了北京大学和清华大学,真的都很大。比赛结果我获得了一个二等奖,GodWang是一等奖,天棋学长是一等奖第一名。对于我来说,依然很开心啊,完全当做是一趟旅游啦。
大一下比赛结束之后,我和老师说我想学图论部分的知识,老师把我叫到了办公室,给了我一本图论书,然后我就回去看了,之后的几个月中,直到大一结束的暑假集训,我才把那本书学完,学到的知识还是很多很多的,有最短路、最小生成树、二分图匹配、网络流、费用流等等。
原本我以为,ACM竞赛会像高考数学一般,大多数题目都是送分题,平时认真学习就能做出来。然而,这种思想在我学习了网络流之后就被完全颠覆了。这完全是一个比拼智慧的竞赛,对于参加这个比赛的同学来说,自学能力一般都是比较厉害的,也就是说学习一个算法是相对较为容易的事情,花时间,花精力必然能够领悟算法的真谛,难的是运用算法解决问题。算法仅仅是解决某个问题的某个步骤中的工具,而不是看到题目就想去套某种算法。
时间过的很快,大二上开学了,要准备去区域赛。我们队去了长春站、北京站以及ECfinal站。这是去年的比赛经历以及感悟http://www.cnblogs.com/zufezzt/p/4971067.html。在比赛间隙期间,我花了不少时间去学了线段树、2-SAT等算法数据结构。
在区域赛结束之后,我完成了张帅老师C#期末课程作业。想学以致用,我花了一星期写了一个消灭星星。http://www.cnblogs.com/zufezzt/p/5039755.html。
大二的寒假,在天棋学长的建议下,我开始去codeforces上做题目,感觉那些题目的风格和比赛十分相似。在那段期间里,我还钻进了动态规划的大海,疯狂做各种动态规划的题目,线性dp,DAG上的dp,树形dp,区间dp,状压dp,做了一大堆dp,做了这些之后,感觉对状态的分析有了更加深刻的理解,很多很多算法都是状态之间的转移,对状态的分析尤为重要。
到了大二下,也就是2016年开始,又是一个循环,开始了蓝桥杯省赛、浙江省大学生程序设计竞赛、蓝桥杯决赛。这次去蓝桥杯,我有了更足的信心,在蓝桥省赛中获得了一等奖,然后去了北京决赛,这次去北京的只剩下我,GodWang还有xiang578了,决赛上发现什么题目都不会写,只好上暴力,考完出来我们都觉得这次要大崩盘。成绩出来,我和xiang578都获得了一等奖,很幸运,今年我是一等奖第一名,特等奖是是浙江理工大学参加过ACM全球总决赛的大神。在我们的讨论组里,天棋学长还开玩笑说我们队是万年老二……。今年的省赛中,比较惊险,最后一个暴力枚举+贪心的题,由于一个小错误,一直WA,直到最后我们一起查错,终于发现了问题,有惊无险,跟着队友拿了金。
在今年的上半年,先去考了PAT乙级,得到了满分。之后刷完了甲级的题库,在甲级的考试中也同样得到了满分。刷PAT甲级的题目最大的收获就是编码的速度与正确率有了大幅度提高。
暑假里,我们进行了多校训练,训练的题目难度真的是有点大,但是我已经能独立做出来一些题目,这一点是自己完全能体会到的。每次赛后,都会把不会的题看着题解进行补题,在补题的过程中也总结了一些解题经验,接触到了很多新的算法知识:后缀数组、FFT,最大权闭合子图,CDQ分治等等……,暑假训练的收获是很大的。
我还记得有一个题,在想了很久之后终于有了思路,然后打开电脑开始敲,在经历了无数次的WA,TLE之后,终于得到了AC,那是凌晨,结果激动的一晚上没睡着觉。
还记得有一次做codeforces上的一个构造题,思路立马就有了,但是写程序会有很多细节,写完提交发现在第92组测试数据的时候答案错误了,也就是说前91组答案都是正确的,那时候简直就要崩溃。最后直到凌晨1:30左右,我发现了一个之前没有考虑到的情况,改了之后就AC了……,在ACM路上,有太对这样令人激动、感动的瞬间。
这学期的区域赛,我映像最深的是青岛赛区那个费用流的题目,第一眼看到那题,我就觉得能AC,而且解题要点也想到了,但是就是TLE。赛后听题解说是浮点误差导致的超时,加一个eps消去误差或者把double改成float就能AC了……,当时简直就是崩溃了,也就是如果我们第一次提交的代码就主要到这个小问题,那么在那场就能夺金了……,毕竟解题的思路完全是正确的。似乎每场比赛,都有很多队伍能过的题我们不会做,以后还是要继续拓宽解题思路、总结经验……
参加ACM提高了我的表达能力,老师经常会安排学长给学弟学妹们讲课,想把一个问题讲透彻,自己必须掌握其根本,又要有良好的表达能力,经过从大一到现在那么多次讲课,我十分能体会到自己的表达能力变强了不少。
参加ACM也提高了我的做事与为人处世的能力,前段时间举办了院赛,我参与了从命题、整理试题到采购气球、踩气球、发气球等一系列事情,做了一个总结http://www.cnblogs.com/zufezzt/p/6129934.html。
ACM竞赛,很多人都是从入门到放弃。我们这一伙人(天棋学长,godwang,我,xiang578,haihongs)从大一坚持到了今天,都有了收获。我很幸运,很开心能够遇到这样志同道合的朋友能够在9406一起学习,一起打地铺睡觉、朝着同一个目标一起奋斗。这个领域,智商高的人很多,用功的人更多。经历了那么多场比赛,开阔了很多眼界,那次带学弟们去宁波CCPC决赛,亲眼目睹了清华大学神犇们解题的经过,真的是叹为观止。参加这个比赛,还有一个好处就是不会自我膨胀,始终会觉得自己很菜,因为总是能看到很强的人排名比自己靠前,我能做的只能是始终抱着谦逊的态度不断的学习,不断地积累与总结,不断地超越前一天的自己。就像比赛的排名,如果从某一时刻开始不能AC,那么排名只会降不会升。
在接下去的时间里,我愿意继续参加ACM,这学期的比赛场次较多,静下心来学习的机会很少。下一个学期基本没有什么课了,计划在寒假里以及下学期中找回之前疯狂刷题的感觉。回首看自己学过的东西,仔细想想自己真的很菜,没学多少知识,而且学到的都是不难的。要学的东西有很多很多,必须提高自己的技能。如果有公司面试的机会,也愿意去尝试一下。
对于学弟学妹们的训练计划,我建议是从简单的东西开始,首先语法不能存在任何问题,可以去刷PAT乙级题目。也必须学会简单的数据结构与算法,至少课堂要求的都要会,可以先学习搜索,然后刷PAT甲级题目。然后开始算法学习,一开始可以学习简单易写的算法,如二分、三分、简单动态规划、构造和一些简单数论题目,开拓一下思维,因为这些题一般不存在高难度算法知识,都是靠想的,这些题目可以是codeforces Div2 的前三题;也可以做一些编码量较大的模拟题,训练编码的速度与正确率。之后就可以刷专题开始学习一些树状数组、RMQ、并查集、线段树等较为好写的数据结构;网络流、二分图等图论知识;AC自动机、后缀数组、回文树等字符串处理工具;以及做一些数论,计算几何的题目。但在学习算法的过程中,我觉得只学算法是不合理的,还是需要配合做codeforces题目来灵活运用算法知识解决问题。也必须要让学弟学妹们知道,这不是一个套算法的竞赛,而是一个思维竞赛,算法是解决问题过程中的辅助工具。做codeforce的题目并不一定要求现场做,赛后做也没有太大的关系,一般div.2的题目做4题还是可以的,对于想不出来的题目,看了题解也要写出来。