十万行代码——记我的ACM之路

欢迎关注我的个人博客:www.zuzhiang.cn

 

记得有人说过,要想成为某个领域的精英就得花费一万个小时;好像也有人说过,要想熟练的掌握某门编程语言就得写十万以上的代码。我算了一下,大学以来差不多总共写过1500多个 .c/.cpp 文件了吧,如果每个文件的有66行代码的话,也差不多十万行了吧,然鹅,我离大佬的差距好像还是很远……

 

写这篇文章呢,主要是要从实验室滚蛋了,纪念一下。也想给还在ACM之路上徘徊的学弟学妹们一点点微不足道的个人经验,还望大佬们勿笑。以下所谈均为我个人意见,不代表ACM国际官方观点~

 

先简单回忆自己的ACM之路。记得初次接触ACM是在大一下学期,因为C语言成绩比较好,被两位老师拉进实验室。当时觉得自己和大佬们的差距很大,又不想面对,其实是有点不情愿的,所以说啊,有差距不可怕,只要敢追赶就好。不过由于座位有限,到了大二上才算正式踏上我的ACM之路。一进实验室,每天对着电脑只会做一下队长布置的每周要做的题,完全不知道该主动做些什么,学些什么知识。有时候甚至会为了在签到表上签个字而来实验室待会,现在想来也确是可笑。

 

转眼到了大二下学期,因为上学期末自己发生了一点不愉快的事情,为了让自己不经常去想一些不愉快的事,我打算让自己忙起来,忙起来就好了,然后开始慢慢的把泡在实验室里,然而,这时候我还是不是很明白我想要的是什么,我该做些什么。直到去年省赛老师宣布我作为一名队员参赛的那一瞬间,其实当时只是单纯的不想给两个队友拖后腿,然后那段时候疯狂的学习,每天几乎都在实验室,很晚才回宿舍。感觉那是我学到新知识最多最密集的一段时间。

 

到了省赛,做了3道题,第4题一直想不明白,后来知道是没搞懂题意。出来的时候内心非常忐忑,因为3道题想要得牌是非常困难的。到了滚榜的时候,一开始还比较快,到了要揭示铜牌区的时候变得异常缓慢(应该是为了节目效果),而我们就在铜牌区的最后一名,如果铁牌区的第一名在封榜后的一个小时内做出了题,那我们就凉了……然鹅,我们没有那么幸运,当时我还在心里骂了一句:靠!这么狗血的剧情不是只会出现在狗血小说和电视剧中吗……铁牌区第一,真的讽刺,好像做梦……出去之后我们三个就一直沉默不语,远离人群,就连大二的(当时大一)都拿牌了,真的无地自容,晚上大家很欢乐的玩狼人杀,但是我想我们三个心情一定特别复杂。

 

那段时间真的是做啥啥不顺利,总想做点什么证明我能行,但是总是被现实啪啪打脸。不过,我现在是很感激这次失败的,我也是在那之后第一次明白了“只问耕耘,不问收获”这句话的道理。如果那时候我侥幸得牌了,依我的性格很有可能飘飘然自满,而不再踏踏实实的学算法。可见有时候得牌也不见得是一件好事,反之不得牌也不一定就是件坏事。知耻而后勇就好。也是从那时起,我才知道自己如果努力一把是有能力得牌的,我也找到了我的目标——我想要那块牌。

 

其实到了大三下学期,内心有点浮躁了,又是要忙着考研啥的,比起上学期,这个学期好像没有学到太多的算法知识。可惜了上一个寒假,果然说要假期学习什么的都是不靠谱的……

 

好了,进入正题,来说下在ACM学习中我的一点经验。我现在回想之所以刚进实验室的时候无所适从就是因为不知道自己该学啥,进一步说就是学的东西不系统,都是做题碰到什么知识点然后去学。然鹅,学多了会发现好多知识点之前是有关系的,比如如果你学会了并查集,那么克鲁斯卡尔版的最小生成树算法就比较好实现了。所以我觉得大家可以照着某一本数书或者某个模板的知识点循序渐进的学习,我给大家推荐一下《ACM/ICPC程序设计系列》的书,有数论、图论、组合数学、计算几何等。里面知识点部分讲解的还可以,主要是还有相应的POJ等上面的题可以接着练一下。还有《挑战程序设计竞赛》这本书,上面的技巧很多,但是个人感觉有点晦涩,待有一定基础的时候再看也好。

 

大家都知道,算法学习其实是比较枯燥的一件事情,因为学习过程中经常会遇到瓶颈,但是对于比较难的知识点和题目不能总去躲避,还是要硬着头皮上,这样才能有提高。我觉得算法学习(包括看题解)都有以下由优到次的级别:看别人的思路,自己实现 -> 读别人的代码,然后自己不参考任何东西敲出 –> 先比着敲一遍,然后再慢慢去理解。如果你什么时候能不参考任何东西把代码准确无误的写出来了,我觉得你就是真的掌握了。

 

除了算法知识的学习,刷题也很关键,你会发现题目做多了,一些题自然就有思路了,正所谓熟能生巧吧。但是我极其反对太过依赖于题解,还是要独立思考,就算你的思路会超时,也要想方设法去优化,去另寻他法,而不是一不会就去看题解。一般,做题的时候,我在理解题意的同时会分析一下时间复杂度,有时候甚至可以通过时间复杂度来判断要用什么算法。如果是1000左右,基本暴力即可;如果是 1e5,最多应该是O(logn)的时间复杂度;如果再大点就要看优化或者找别的思路了;如果非常大,超过1e9,则很有可能是有公式或者有规律。

 

另外刷题也最好按照难度的递增或者题目分类去刷,这里给大家推荐 51nod 这个网站,可以从1级题开始刷起,很多题的解题方法都是很不错的。还有著名的codeforces,不过我觉得这个题目不错,但是类别太杂了,可以当作比赛打一下。还有一点我比较推荐的就是要写博客,因为有些题你看题解你可能觉得也就这么回事,但是让你自己做还是做不出来,但是如果你要写博客给别人写明白就不一样了,你一定会要求你自己彻底搞懂这道题。当然写博客会耗一点时间,也不是所有的题都要去写出来。而是那些思路比较新颖,有点难度的题。如果写就希望认真一点,不要说显然……然后给出个结果……另,给代码加上必要的注释也是很好的习惯。

 

还有就是可以模仿大佬们的代码风格,比如我之前定义长整数就会写个 long long,但是后来知道可以 typedef long long LL; 然后就可以用LL代替了,方便了很多,又比如之前会写n/2,现在会写>>1,运用位运算也会让程序运行的更快一点。偷偷告诉你们,好好把握身边的大佬,有不懂的就去问,不要不好意思,你会受益的。

 

最后,说点有关ACM比赛的,ACM是三人赛,三个人荣辱与共,三个人的配合很重要,比赛时一定不要指责某位队友而破坏三个人的心态,赛前也应该按照比赛的要求多磨合,锻炼三人间的配合度。当然,最重要的是不要辜负你队友的期望,给队伍拖后腿。

 

最后的最后希望还在ACM之路上前行的学弟学妹们能继续加油,胜不骄败不馁,来年赛出你们的水平,我最近也的确感受到了和大佬之间的差距,希望有机会可以把我薄弱的部分增强一下。好了,好了,滚去考研了,拜~

  • 11
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值