![](https://img-blog.csdnimg.cn/20201014180756913.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
PAT甲级真题
艾_Mi杰
算法很苦,坚持很酷!
展开
-
2021年春季PAT甲级考试
作为一个绩点不高、牌子不硬的退役ACMer,去年冬天在npy的鼓励下,决定先试试PAT为考研做准备,于是认认真真把所有20分的题目过了一遍。放寒假以后,就开始练习所有25分的题目,并且每道题做完以后都总结了博客,供别人学习,也供自己复习。结果时间安排上出现了问题,导致后面没有太多时间写程序,整个2月份到今天,没写过一行代码(大家参与程序设计考试一定要避免这种行为)考试竟是第一次打开编译器写程序。。。最后没能把PAT题库刷一遍,然后将每道题的高质量题解做出来也是PAT考试中的一个遗憾吧。根据个人做PAT题库原创 2021-03-13 17:22:16 · 3163 阅读 · 13 评论 -
1040 Longest Symmetric String (25分)
题目大意:求给出字符串的最大回文子串。思路:最大回文子串是可以通过区间dp来求解,但是题目中数据并不大,可以直接暴力求。在此只给出dp的状态转移方程(其中dp[i][j]表示字符串从i到j是否是回文):dp[i][j] = (s[i]==s[j])? dp[i+1][j-1] : 0代码:#include <iostream>#include <cstdio>#include <cstring>using namespace std;string s;原创 2021-01-30 23:01:52 · 120 阅读 · 0 评论 -
1039 Course List for Student (25分)
题目大意:给出k个课程的选课学生,再给出n个查询课程的学生。按照输入顺序,将每个学生的选课数、所选课程编号(课程按照编号递增)输出。思路:用set数组来储存每一个学生所选课程的课程号。所以需要一个map根据学生姓名来映射set数组中的下标。代码:#include <iostream>#include <cstdio>#include <cstring>#include <set>#include <map>using namesp原创 2021-01-30 22:34:54 · 93 阅读 · 0 评论 -
1037 Magic Coupon (25分)
题目大意:nc个优惠券,np个商品。若用价格为a的优惠券购买价格为b的商品,则用户可以得到a*b的返现,求用户能够得到的最大返现额。每种商品最多可以购买一次,每种优惠券最多使用一次。思路:通过将优惠券和商品排序后,使用正值优惠券购买正值商品,负值优惠券购买负值商品,且尽量让绝对值大的优惠券去购买绝对值大的商品,这样可以保证返现额最高,且返现额最低为0。代码:#include <iostream>#include <cstdio>#include <cstring>原创 2021-01-30 21:37:52 · 99 阅读 · 0 评论 -
1036 Boys vs Girls (25分)
题目大意:给出n个学生的姓名、性别、ID和成绩。求取得最高分的女生和最低分的男生。分别输出两人的姓名、ID,以及女生成绩减去男生成绩的差。思路:此处给出两种解法。使用两个优先队列分别来维护男生和女生的信息。男生队列中成绩低者位于队首,女生队列中成绩高者位于队首。使用一个vector来存储学生信息,最后按照性别升序、成绩降序进行排序,这样第一个就是女生成绩最高者,最后一个就是男生成绩最低者。代码:优先队列#include <iostream>#include <cstdio原创 2021-01-29 20:53:35 · 118 阅读 · 0 评论 -
1033 To Fill or Not to Fill (25分)
题目大意:给出车辆油箱容量、始末位置距离、一单位油可行驶距离以及n个加油站。接下来分别给出n个加油站的油价和与起点的距离。思路:一道相对较为繁琐的贪心。首先按照距离递增将加油站进行排序。如果起点没有加油站,车辆将无法启动。从当前点出发,找到车辆能够到达最远距离中第一个油价低于它的点,那么车辆在当前点只需加用光油箱刚好可以抵达该点的油即可。那么该点将作为新的起点再次执行算法,并将此时的油箱清空。如果在当前点所能到达的最远距离中,不存在油价低于当前点的加油站,则要在当前点将油箱加满,并到达后面油价最低原创 2021-01-28 20:48:20 · 81 阅读 · 0 评论 -
1032 Sharing (25分)
题目大意:给出两个用链表储存的单词,问这两个链表公共后缀的首地址,若没有相同后缀,输出-1。思路:虽然题目给出是链表,但是并不需要使用链表,只需要通过一个数组来映射这种当前结点与其后继的关系。如果使用map每次查询会需要log(n)的时间,而直接用数组则是O(1)的查询时间。代码:#include <iostream>#include <cstdio>#include <cstring>#include <map>using namespace原创 2021-01-28 11:29:52 · 123 阅读 · 0 评论 -
1029 Median (25分)
题目大意:将两个数列合并成一个数列后,若数列长度为奇数,则求其中位数,若数列长度为偶数,求中间两数中的前者。思路:以为是个王者,没想到是个青铜。合成后的数列长度最大为4e5,因此直接sort就行。最终结果为(len-1)/2,此处len为合成后的数列长度,下标从0开始储存。如果数列长度能够达到1e7的话,根据题意,两个数列均为升序,那么应该借助归并排序的思想来实现代码:#include <iostream>#include <cstdio>#include <cst原创 2021-01-27 18:52:48 · 92 阅读 · 0 评论 -
1028 List Sorting (25分)
题目大意:给出n个学生的信息(包括学号、姓名和成绩)。若c为1,则按照学号升序排序;若c为2,则按照姓名字典序升序排序;若c为3,则按照成绩升序排序。若姓名或成绩相同时,则按照学号升序排序。思路:直接sort,有手就行。代码:#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int N=1e5原创 2021-01-27 18:45:34 · 128 阅读 · 0 评论 -
1025 PAT Ranking (25分)
题目大意:给出各个赛点的成绩单,求总的排行榜。给出n表示赛点个数,每个赛点给出k表示该赛点的选手人数,接下来k组数据,每组包含选手注册号和成绩。总的排行榜按照成绩降序,若成绩相同则注册号小的排在前面。每个选手在排行榜中的信息包括该选手的总排名、赛点号和赛点排名。思路:总排名只需将所有人按照成绩和注册号统一排序即可得到。给各个赛点依次进行排序,再将赛点排名更新到总排行榜中显然会超时,因此对于赛点排序需要特殊处理。在总排行榜中,每个人的赛点号是易得到的,那么对于每个赛点都去维护一个rk,代表该赛点在当原创 2021-01-27 18:20:21 · 161 阅读 · 0 评论 -
1024 Palindromic Number (25分)
题目大意:给出一个数n和次数k,每次将n中各位数字颠倒后再加到n上,直到n为回文数字结束,输出此时的回文数字n和所用次数。若在k次内无法使得n为回文数字,则输出第k次运算结束后的n和k本身。思路:由于数字范围较大,需要使用string来计算。对于模拟加法中的两个加数,长度相同,且为另一个数中各位数字倒置后的结果,所以直接进行运算即可实现从低位到高位运算,而不需要将两个数倒置。代码:#include <iostream>#include <cstdio>#include &l原创 2021-01-27 11:29:48 · 111 阅读 · 0 评论 -
1021 Deepest Root (25分)
题目大意:给出n个点,n-1条双向边,求这个图是否是一棵树,若是一棵树,按照序号递增输出能够使该树最高的树根,否则输出该图有几个连通块。思路:首先通过并查集来判断该图是否连通若连通,则以1号节点为根进行一次dfs,找到当前树中最深的子节点,那么可以保证这些节点一定存在于结果中。从第二步得到的节点中任选一个,再进行一次dfs,再找到该树中最深的子节点。这些节点也属于最终的结果中。排序、去重后输出答案。(这里使用STL中的unique函数只能拿到21分,玄学问题)代码:#include <原创 2021-01-26 22:08:07 · 172 阅读 · 1 评论 -
1020 Tree Traversals (25分)
题目大意:给出一棵二叉树的后序和中序遍历,求其层序遍历。思路:无需建树,按照根据后序、中序求前序的思路进行即可。通过一个下标来映射出层序遍历的结果,即根节点为i,则左儿子为i<<1,右儿子为i<<1|1(树根为1)。代码:#include <iostream>#include <cstdio>#include <cstring>#include <map>using namespace std;const int N原创 2021-01-26 17:54:54 · 103 阅读 · 0 评论 -
1007 Maximum Subsequence Sum (25分)
题目大意:给出一个长度为k的数列,求数列中的最大子段和。思路:对于形如-1、0、0、-1、-1这样的数列来说,结果应该是0 0 0。即只有全为负数时,才会输出0和该数列的首位两个数。代码:#include <iostream>#include <cstdio>#include <cstring>using namespace std;const int N=1e4+5;int a[N];int main(){ int n; sca原创 2021-01-26 11:24:46 · 97 阅读 · 1 评论 -
1009 Product of Polynomials (25分)
题目大意:分别给出两个多项式非零项的项数,对应每个非零项的指数和系数。求这两个多项式的乘积。思路:PAT日常坑点多。结果要按照指数递减的顺序进行输出,因此对map中根据key值排序的规则进行重定义。对于结果只关注非零项的情况。代码:#include <iostream>#include <cstdio>#include <cstring>#include <map>using namespace std;map<int,dou原创 2021-01-26 10:57:28 · 109 阅读 · 0 评论 -
1010 Radix (25分)
题目大意:给出两个数N1、N2,再给出一个tag和radix,若tag为1,表示N1为radix进制数,否则N2为radix进制数。求对于另一个数,是否存在某一进制使得两数相等。思路:题目本身并不难,但是坑点巨多。题目所给的数中,每位上最小为0,最大为z表示35,但是进制可能会非常大,所以需要通过long long来存数,同时通过二分来判断是否有正确的答案存在。代码:#include <iostream>#include <cstdio>#include <cstri原创 2021-01-26 10:51:08 · 231 阅读 · 0 评论 -
1013 Battle Over Cities (25分)
题目大意:n个城市,m条双向路径,k个询问。对于每个询问,将所给出城市和与其相关的路径去除后,剩余城市能够连通需要添加路径的条数。思路:对于每个询问通过dfs来求连通块的个数即可,每次需要添加路径的条数为连通块个数-1。代码:#include <iostream>#include <cstdio>#include <cstring>#include <vector>using namespace std;const int N=1e3+5;原创 2021-01-26 10:45:50 · 93 阅读 · 0 评论 -
1016 Phone Bills (25分)
题目大意:给出一天24个时间段的电话收费安排(美分/每小时),再给出n条电话记录,每条记录包含该记录的用户姓名、时间和状态(on-line与off-line),求每个用户该月需要缴纳多少话费。思路:首先将n条电话记录按照用户姓名的字母序递增,时间递增进行排序。对于同一用户,记录其每一对相邻且状态匹配的记录(即两条记录时间上是紧挨着,同时前一条记录状态为on-line,后一条记录状态为off-line)。对于每个用户计算其通话时长和通话费用。对于计算两个时间之间的花费,可以转化为两个时间相对于0时刻原创 2021-01-26 10:38:44 · 132 阅读 · 0 评论 -
1014 Waiting in Line (30分)
题目大意:银行有n个窗口,每个窗口前最多可排m个客户,其余客户将在大厅等待,直到某一窗口前的客户业务办理结束后排到该队伍中。题目给出k个客户办理其业务所需的时间,每个客户会根据输入顺序提交业务处理的请求,并有q个询问,输出每个询问中的客户业务办理结束的时间,若其在17:00前没有开始进行办理,将输出Sorry。思路:每个窗口前都维护一个队列,并将每个队列的队首放在一个优先队列中来维护。通过优先队列可以得出当前完成业务办理的窗口,并由此让所等待的客户进入该窗口的队尾。代码:#include <io原创 2021-01-26 10:25:00 · 124 阅读 · 0 评论 -
1017 Queueing at Bank (25分)
题目大意:一个银行有K个窗口,可同时为K个客户办理业务,其余客户将在大厅等待,直到某一窗口的客户业务办理结束。求每位客户等待时长的平均值。其中,在17:00:00以后到达的客户将无法办理业务,也不会计算等待时间,8:00:00前到达的客户将一直等到8:00:00再进行业务办理。且题目中保证不会有两个客户同时到达。思路:将所有客户的时间转换为秒进行计算。通过优先队列来维护每个窗口的业务办理进程。代码:#include <iostream>#include <cstdio>#i原创 2021-01-26 10:12:14 · 79 阅读 · 0 评论