PAT备考小经验&相关信息

在9月8号下午的PAT考试中,我幸运的拿到了满分,用时1小时45分钟,排名第五,算是成功迈出了转专业的第一步。按照惯例应该嘚瑟一波,然而身边并没有人考这个,转念一想,不如把考试日志和备考经验教训记录下来,以期看见此文的后来者能少走一些弯路,更加高效的刷题学习(虽然可能并没有人能看到 _(:)_ )。

当然,在科班大佬面前我只是个尚未入门的弱鸡,因此这篇经验主要针对有意转行/业余爱好编程/基础薄弱的朋友。

作为第一次在网上写东西的语文渣,我已经预感到本文会比较乱,所以先把打算写的几个部分列出来:一是针对PAT的备考要点,二是刷题过程中可能走的弯路和遇到的坑,三是PAT考试流程和注意事项,四是PAT的相关信息和数据统计简介。另外还准备写一篇解题报告,主要是考试时的思路和AC代码。

一、PAT甲级备考要点

甲级题目的思考量都是不大的,主要是考察对数据结构基础知识的掌握和基本的编程能力,换言之,能否拿高分,和天分无关,主要取决于付出的时间和精力(满分往往还需要一点运气)。在学习和刷题过程中,半天做不出一道、找bug找到怀疑人生什么的太常见了,一定坚持下去,一段时间后你就会发现自己的进步~好,接下来说说备考要点,首先要具备c&c++和数据结构的基础,然后:

1、刷通甲级题库,并且关于树和图的30分大题尽量做两遍。这是最稳妥最有效的方法,甲级考题也常常会以题库里题目的改编形式出现,如这次的2、3、4题都可以在题库里找到相似的。另外,以前刷微博的时候看姥姥说过,甲级题库里有一些早期的保研机试题是超纲了的(比如涉及到动态规划的题目),而甲级真题是不会超纲的,所以,如果时间紧张,优先做考纲内的题,动态规划等超纲内容了解思想即可。

2、强烈建议配合晴神宝典(即《算法笔记》,胡凡、曾磊著)刷题!!这本书我只能说相见恨晚,可以帮助非科班人士节省大量时间,而且要优先学习STL,非常强大非常实用。

3、开一个记事本,记录自己常犯的编程错误和考虑不周之处。因为把“==”写成“=”之类的错误而浪费一下午简直令人崩溃,而记下常犯的错误则能辅助自己快速纠正错误习惯。尤其是对于新手,“我觉得我会做”和“我真的能AC”之间差了十万八千里,唯有脚踏实地多写多总结才能提高。这次考试我4道题都是一次AC,这个习惯功不可没(虽然头号因素大概是运气= =)。

4、AC不了不要死磕,去找大神的博客学习吧。比如柳神的题解就都很厉害。

5、在学习大佬博客的时候,你可能会发现某些题你不会做是因为你不会某些算法,比如dijkstra+DFS,这时可以去翻晴神宝典,动笔or敲键盘写一遍模板,然后设个备忘过几天回来再做。这样会记得比较牢。

6、其他一些小tips:“二指禅”的朋友建议练习一下标准指法和盲打,盲打编程比低头抬头的敲键盘舒服很多;因为考场都是台式机,所以练习的时候最好买个大键盘,而且大键盘打字速度也更快;去官网找到考场编译器,下载相应编译器并练习,用Dev-C++的话注意记住使其支持c++11的操作。

PS:以下两个坑希望大家在刷题前注意一下:1)甲级1029,题干中说数据范围是long int,但实际上测试数据都在int范围内,由于内存限制,按long int写是过不了的。(更正:这里是我理解错了,实际上,long int 不是 long long。古老的C语言有short int和 long int,现在 int 就默认为是 long int。)   2)甲级1108,像1.之类有小数点但没有小数位的数据是合法的(做完这题后建议学习一下sscanf和sprintf函数)

二、我的学习过程和走过的弯路

我是电气工程专业的,所以老老实实的学过一年c++,也水过一学期的数据库。尽管如此,在今年3月学习MOOC上浙大的数据结构时也被虐的很惨。而且那个时候主要把考研作为一个备选念头,只是单纯的加了考研群和以课外拓展的心态学习数据结构,效率极度底下,现在回想起来,真是又把大好时光喂了狗。。。总之,编程入门很可能比想象的难,放平心态,但也要给自己一点压力,写代码尽量限定时间。

有了C++和数据结构的基础后就只剩刷题了。但不要自己闷头刷和死磕,尤其是连STL都不会用的时候。我7月份平均下来每天刷题大概两小时,但是只做了20几道,知识储备方面也只有看别人题解和博客学到了一点零碎的STL及字符串处理知识,可以说是把大量时间花在了无用功上。

到了八月,无意中翻看了晴神宝典,当时就感觉“哇!这就是我想要的!”(感觉像推销哈哈,但真的就是这种感觉!)。然后连续几天学习了STL、dijkstra+DFS、动态规划和字符串处理,然后做题速度直接就质变了= =八月份压力比较大了,每天花一个下午做4题的样子,时间控制在三小时,但是因为做完题基本不想干其他事了,所以每天都是奉献了一下午给PAT的,限时限量后明显感觉自己的编程基本功慢慢变好了。这个阶段最后悔的就是太喜欢死磕了,总觉得题要自己做出来才行,看别人的就不算数了,于是好些晚上都对着屏幕,头晕眼花的找下午没有AC的题目的bug。其实死磕这种题真的没有意义,主要是太浪费时间,等慢慢有了更多积累再回头看自热而然就会做了。当然也有例外,1026我留到最后做的,结果怼了一整天也没成功,最后百度大佬的解题报告后又改了一晚上 _(:)_

总结一下,其实就是初学者要以学习为主,应该把时间主要花在知识的积累和对他人优秀思路的学习上,而非总是自己闷头搞个又丑又笨的解法,只有先积累到一定程度才能思考出好的方法。以及,有压力才有效率。最后,学习要系统化,这里再次推荐晴神宝典(感觉自己要变成小迷弟了= =)

三、考试流程及注意事项

这个地方简单提一下,毕竟很少有人会在考试中出问题,但总是有出各种状况的。。。

我参加的这次考试流程大致如下:提前15分钟进场,检查准考证,签到,做到指定位置。老师已经帮忙开好考试的页面了,不许自己再开其他浏览器,不然会被截屏并算违纪。等开考时间到了点击进入题库就可以答题了,开考前不要点进去,不然你看不到题目但是会计算考试时间。

因为企业在看你成绩的时候还可能考虑你的提交次数,所以,提交前最好检查一遍。

PS:我在的考场出状况的同学有:迟到、没带准考证、看到电脑息屏不是摇摇鼠标而是直接重启、踢到电源线导致重启。毕竟交了150+,大家还是要认真点对待啊。

PAT对时间和内存的限制一般很宽,所以只要大方向是对的,就不用太在意优化代码了。实际上,大多数题目你正常做耗时在限制的1/4到1/10,这次考试更是正常解法都在规定的1/10以下(记得耗时最长是最后一题,然而直接建树+查找也只要70来ms,远低于限制的1000)。而且,很多题都是直接暴力解决就好了,要是想不到好方法,就暴力枚举吧,说不定直接就AC了呢?

四、PAT的相关信息和数据统计

官网简介:计算机程序设计能力考试(Programming Ability Test,简称PAT) 旨在通过统一组织的在线考试及自动评测方法客观地评判考生的算法设计与程序设计实现能力,科学的评价计算机程序设计人才,为企业选拔人才提供参考标准。

PAT考生主要分为找工作党和考研党(甲、顶级可抵浙大考研机试),也就是说,除了极少数可能存在的来玩的大佬,甲级大多考生为普通选手,以及1/3左右的捐款选手(据说每次都有1/3左右的0分,估计是交了钱弃考了)。

以下统计了近几年甲级的考试人数、满分人数、对应习题集的习题:

时间 2015.3 2015.9 2015.12 2016.3 2016.9 2016.12 2017.3 2017.9 2017.12 2018.3 2018.9
甲级人数 468 659 276 532 622 271 973 1207 464 1459 2237
满分人数 42 26 43 21 42 19 161 59 9 56 49
满分率 8.97% 3.95% 15.58% 3.95% 6.75% 7.01% 16.55% 4.89% 1.94% 3.84% 2.19%
对应习题 1092-1095 1100-1103 1104-1107 1108-1111 1116-1119 1120-1123 1124-1127 1132-1135 1136-1139 1140-1143 1148-1151

此外,2018年考研机试情况如下:去年浙江大学计算机类专业考研进入复试有235人,其中118人选择使用PAT成绩代替机试成绩,这118人中有27人满分。最终,机试三人缺考,满分48人,平均分78.43,因为强军计划比较特殊,除去这一部分考生的话机试平均分80.18。

五、关于考纲

考纲里要求掌握的算法为:哈希映射、并查集、最短路径、拓扑排序、关键路径、贪心、深度优先搜索、广度优先搜索、回溯剪枝等。

哈希映射:一般会用map和unordered_map就好。此外,比如说题目固定了关键字为4个大写字母,那么可以把关键字看成26进制数,这样就能把字符串转换为int型数据处理,提高程序运行速度。当然基本概念也不能忘,解决哈希冲突的基础方法要理解,包括开放地址法(线性探测、平方探测)和链地址法(开放定址法)。

并查集:主要就是掌握findfather函数(找到某节点所在集合的“根”)。压缩路径的函数如下:

int findfather(int a){
  if(a!=father[a]{
   father[a]=findfather(father[a]);
  }
  return father[a];
}

最短路径:主要掌握dijkstra+DFS。如果出现了负边权,就用bellman-ford(尚未考过)。

拓扑排序、关键路径:可以做做PTA上的 Data Structures and Algorithms (English)题目集7-12和7-18,数据结构与算法题目集(中文)7-11。

贪心:考的很少。印象比较深的是甲级题库1033 To Fill or Not to Fill,挺难的。

DFS、BFS:算是必须掌握的基础了。

回溯剪枝:就记得甲级题库里的1103了,不过因为内存限制放的宽,用动态规划暴力做也可以。

此外,AVL树的插入删除要会写。

根据树的各种遍历方式构建二叉树经常考到,最好熟练掌握。

堆的构建、删除、插入要会写,即“自顶向下”和“自底向上”调整堆。

最后,关于最小生成树和动态规划,这两个都是顶级的内容了,基本不会考,但是思想并不复杂,多学一点总是好的,学有余力建议了解一下。动态规划甲级题库有好几道,背景都很经典;求最小生成树用的是贪心算法,可以做下PTA上数据结构与算法题目集(中文)7-10,prim和kruskal算法都试试。只是简单学习的话还是很快的,也比较有意思。

猜你喜欢

转载自blog.csdn.net/qq_38658814/article/details/82534765