讲在前面
基本情况:本人非科班出身,之前有些许的数据结构基础,上次乙级95,这次满分通过了8012年九月份的PAT甲级考试。在此为自己留下一点感想,激励自己仍需自省的同时,略陈些许经验,以期给仍在努力刷题的PATers提供或多或少的帮助。
如何备战PAT甲级?
首先需要具有简单算法和数据结构的基础,这个可以通过通刷一本科数据结构与算法的教材来实现,我当时使用的是一本比较low的武大版教材。需要达到一个什么水平呢?至少本科教材中所有的算法都能够独立的实现,题目也能够独立的完成,尝试地了解书中每个问题的出发点、限制条件、实现方法、实际效果、不足之处。例如常见的树、图、栈、队、堆、集合,以及对应的模拟、遍历、排序、广度优先、深度优先、回溯、动态规划、贪心、分治等,它们的经典实现包括但不限于平衡树、最小生成图、最短路径、拓扑排序、关键路径、节点编码、快排、堆排、并排、并查集等。这些底层的思想会贯穿于PAT甲级的始终。
临近考试,尽量通刷PAT往年的题库,对于每一道题,我们都需要主动的去思考,这道题为什么这么做,有没有更好的方法(时间、空间和代码量等),不能局限于一道题的仅仅通过。反复的思考加上不断的阅读别人的优秀代码,能让我们对于基础数据结构和算法实现的理解更上一层楼。例如,我在有些题AC过后会去想其他的实现方法,这个还能不能用别的方法做出来,没准可以得到更好的效果,当然实际还是需要严谨的证明。在各大博客、github等分享平台上总可以找到比自己的实现更合适的代码。适时的总结与归纳能深入你对问题的理解,例如,我在写了几个水博自娱自乐的同时分析了一下一些实现的预期时间或空间消耗等(PAT 甲级 1057 Stack(30 分) 树状数组,二叉树和分块法对比),在今天下午考甲级时会主动地思考某种方法能否实现题目要求的时间、空间限制等。在这里推荐一个博客(柳婼PAT解题目录)和基友的github解题目录(终不是少年人PAT解题目录),在这里由衷地感谢他们。
关于语言的选择,C++是首选,主要基于其丰富的模板库以及超高的运行效率。要知道题目的时间限制一般为C标程的3~5倍再加100ms,例如我们看见的100ms限制,在C标程下仅有1ms左右的运行时间。说到这里,需要提一点,请各位在PAT网站上刷题的时候,不要觉得自己刚刚达到题目的时限要求就觉得这道题没问题了,在真正的考试的时候,多人同时给服务器提交代码的过程中,很容易造成服务器压力过大而造成实际运行时间比练习时侯提交的代码运行时间长的现象。作为这一点的佐证,包括但不限于1138和1151题目中尝试使用建立完整二叉树这个思路来解题而卡着题目要求的时间通过的情况。Java的JVM启动时间据说很长,Python作为解释型脚本语言不太适合底层的高效操作。
考试时,心态是最重要的,不能因一时之失而乱,亦不推荐上来就码。例如本次考试中我没有一道题是读完即清晰了解其中的每一个考虑点的,但是我花了的大量的时间去思考,把所有的逻辑理清。作为一名弱鸡,我总共花了接近2小时在逻辑思考和2张正反面草稿纸用于记录各种情况,那么在实际的总计约40多分钟的码代码过程完成后,我仅需要简单的debug就直接提交,所有的代码均在提交时一遍就过,代码大多三四十行,最长运行时间44ms。我本人是很反感debug的,因为总是可能有貌似不起眼的bug也许会影响着我接下来心情,我相信大家都有过例如因为码错或者头脑不清晰导致一个操作符的误使用而debug很久的经历,也许也会是一个小小的范围错误等。在我考试的考场中,有很多开考即码的人,键盘声不绝于耳,但是他们绝大多数没有像我一样提前交卷,或者正确率很高。要知道,对于一般的人来说,让他们在几十分钟内debug一个不起眼的错误,可能还不如重新码一遍靠谱。当然,对于褴褛的缝缝补补总不如厚积薄发的无误来的爽快。对于那些混迹ACM的大神,对于问题的所有逻辑都早已想清的话需另当别论。
还有一点,我相信大家考了这么多的试,已经知道了选择性放弃,切不能在一道题上面钻牛角尖,PAT考试亦如此。