PAT
HackingGate
这个作者很懒,什么都没留下…
展开
-
PAT A 1026 Table Tennis 模拟
PAT A 1026 Table Tennis 解题报告还不熟悉markdown语法,就先不在意格式了。刷了一个多月的PAT,第一篇解题报告就献给A1026这个对我而言非常复杂的模拟题吧。题目的主要设定有以下几点:(1) 玩的时间不能超过2h。(2) 优先选择序号小的空桌。(3) 在21:00之后(含21:00)还没玩上的玩家不需要输出。(4) 玩家有是否vip之分,桌子也有是否vi...原创 2019-07-21 16:39:31 · 142 阅读 · 0 评论 -
PAT A 1051 Pop Sequence (25 分) 栈
1051 Pop Sequence (25 分)Given a stack which can keep M numbers at most. Push N numbers in the order of 1, 2, 3, …, N and pop randomly. You are supposed to tell if a given sequence of numbers is a pos...原创 2019-07-22 09:22:28 · 213 阅读 · 0 评论 -
PAT A1101 Quick Sort (25 分) 快排
题目要求很简单,就是在数组中找到一些元素,它们左边的数都比它小,右边的数都比它大,暴力做肯定是超时的。题目写明了快排应该也是提示作用,我一开始想到的是满足这些条件的元素在排序后肯定位置不变,所以直接排序然后找对应位置相同的元素就行了,然后只过了两个测试点。 原因在于,满足这个性质的元素肯定位置不变,但是位置不变的元素不一定都满足这一性质。例如,数组[3 2 1 4 5],其中 2 ...原创 2019-08-17 22:09:25 · 203 阅读 · 0 评论 -
PAT A 1155 Heap Paths (30 分) 堆
题目大意:对于给定的完全二叉树,判断是否是最大堆或是最小堆, 在输出每个叶子节点到根节点的路径,要求要按照叶子节点从右往左的顺序输出。 为了方便起见我是从数组下标0位置开始存储的,这样父节点的下标为 i 时,左孩子的下标是 2*i + 1, 右孩子的下标是 2*i + 2, 下标最大的非叶子节点 的下标是(n - 1 - 1) / 2, 其中 n 是总节点数。 判断最大...原创 2019-08-17 23:31:09 · 148 阅读 · 0 评论 -
PAT A1043 Is It a Binary Search Tree (25 分) 二叉搜索树
题目大意是:定义BST,其左子树都是小于父亲节点的值,右子树都是不小于父亲节点的值。以及镜像BST, 其左子树都是不小于父亲节点的值,右子树都是小于父亲节点的值。然后给出一个序列,判断是不是BST或者镜像BST的先序遍历序列。 对于这个问题,首先我看到BST就想到中序序列有序了,然后想能不能通过先序和中序序列来构造一棵树,再判断是不是BST。但很不幸,犯了一个错误,...原创 2019-08-19 22:14:29 · 88 阅读 · 0 评论 -
PAT A1064 Complete Binary Search Tree (30 分) 完全二叉树 二叉搜索树
题目大意:给出一个序列,构造是完全二叉树的BST,输出层序遍历结果。 这一题要同时结合完全二叉树和BST的性质来做。完全二叉树可以用一个数组 bst 存储,而BST的中序序列有序。题目已经说了是N个不同的整数,因此也不用考虑重复元素到底放左子树还是右子树了。对中序遍历的函数进行改写,在中序遍历到某节点时,按顺序将中序序列的元素赋给遍历到的节点。这样就完成了bst的赋值,输出数组 ...原创 2019-08-19 22:49:31 · 132 阅读 · 0 评论 -
PAT A1099 Build A Binary Search Tree (30 分) 二叉搜索树
题目大意:给定BST的结构,并给出其中元素的序列,构造出吻合的BST。 和A1064非常相似, 还是利用BST中序序列有序的性质。由于题目给结构是类似于数组的格式,以-1代表NULL, 0代表根节点。所以也用数组来存储这棵树的节点,不过因为不是完全二叉树,只能通过在结构体中增加左右孩子域来记录左右孩子的信息。然后就是和A1064一样,改写中序遍历函数,在中序遍历到某一节点时...原创 2019-08-19 23:21:20 · 83 阅读 · 0 评论 -
PAT A1115 Counting Nodes in a BST (30 分) 二叉搜索树
题目大意:给出一个序列,按照序列的顺序来构造BST,注意这里BST的定义中,左子树是不大于父亲节点的,右子树是大于父亲节点的。然后输出最低的两层的节点总数。 首先按照序列顺序构造BST。因为要输出最低两层的节点总数,自然想到层序遍历,并且给节点加上记录层数的域layer。然后在层序遍历的同时更新节点的layer域的值,以及最大的层数maxLevel。 为了避免得到...原创 2019-08-19 23:47:11 · 213 阅读 · 0 评论 -
PAT A1127 ZigZagging on a Tree (30 分) 二叉树
题目大意:给出中序和后序序列, 还原二叉树,然后进行一种Zigzag的层序遍历,即从根节点(记为第0层)开始输出,第1层从左向右输出节点,第2层从右向左输出节点...依次循环。 首先是根据中序和后序序列还原二叉树,这个我还不太熟,debug了几次才成功,注意root = NULL的时候要 new 一个节点。然后就是进行普通的层序遍历,并且更新每个节点的层数信息layer域...原创 2019-08-20 09:05:18 · 163 阅读 · 0 评论 -
PAT A1135 Is It A Red-Black Tree (30 分) 二叉搜索树
题目大意:给出红黑树满足的5个性质,然后给出先序序列,判断是否是红黑树。 题目给出的红黑树的5个性质如下:(1) Every node is either red or black. 每个节点要么是红色,要么是黑色。 (2) The root is black. 根节点是黑色。 (3) Every leaf (NULL) is black. 每个叶子节点(即NULL节点)是黑...原创 2019-08-20 10:21:12 · 251 阅读 · 0 评论 -
PAT A1138 Postorder Traversal (25 分) 二叉树
题目大意:给出先序和中序序列,输出后序遍历的第一个数。 一开始直接使用常规的先序和中序序列构造树的方法,然后进行后序遍历输出,有两个测试点超时。 于是考虑优化,因为建树过程是从左子树到右子树进行递归的,那么后序遍历输出的第一个数,应该是建树过程中第一个叶子节点,也就是建树过程中第一个左右孩子都为空的节点,也就是建树过程中,第一个在中序序列里的,左边剩余元素leftNum...原创 2019-08-20 11:12:27 · 133 阅读 · 0 评论 -
PAT A1016 Phone Bills (25 分) 排序
题目大意:统计电话费用。一天24小时,给出每个小时内的电话费(cent/min)。之后给出N条通话记录,每条记录包括用户的姓名、记录时间和通话状态(on/off)。要求为每个用户都生成一份账单。值得注意的是, 对同一个用户而言,有效的通话记录是在时间上相邻的两条,前一条是on, 后一条是off。不满足这个条件的通话记录全部忽略。例如,某个用户的记录中,6h01m 是on,5h59m...原创 2019-08-21 19:40:55 · 182 阅读 · 0 评论 -
PAT A1095 Cars on Campus (30 分) 排序
题目大意:统计校园内某一时刻的车辆数。给出N条记录,每条记录包括 车牌、记录时间 和 状态(in/out)。然后给出K个时刻,查询每个时刻的总车辆数,这K个时刻是按照时间递增顺序给出的。与PAT A1016 Phone Bills相同,对于同一辆车而言,只有在时间上相邻且状态不同的两条记录被认为是有效的。与PAT A1016不同的是,本题数据量非常大,需要仔细优化。 ...原创 2019-08-21 20:06:44 · 255 阅读 · 0 评论 -
PAT A1105 Spiral Matrix (25 分) 模拟
题目大意:给出N个数字,要求将这些数按照从大到小的顺序螺旋填入一个 m * n 的矩阵中,m > n 且 m - n取最小值。 核心问题是如何将数字螺旋填入矩阵,如果定义要填入位置的坐标是(x , y) ,初始值显然是(0, 0), 要在每次填入之后决定下一次填入的位置坐标。坐标轴取列增大的方向为y的正方向, 行增大的方向为 x的正方向, 然后定义两个增量数组 dx[ ] = ...原创 2019-08-22 09:21:01 · 128 阅读 · 0 评论 -
PAT A1001 A+B Format (20 分) 字符串
题目大意:计算整数A+B并输出,输出格式是每三个数用逗号分开,例如,-999991要输出为 -999,991。 字符串处理问题。先用 to_string 得到 A+B的字符串结果,然后定义一个空字符串,按每三个数字一组,从后向前复制原字符串,每三个数加逗号。最后倒序输出。AC代码如下:#include <iostream>#include <vect...原创 2019-08-24 09:47:17 · 141 阅读 · 0 评论 -
PAT A1002 A+B for Polynomials (25 分) 模拟
题目大意:以 (幂 系数) 的格式给出两个多项式 A B,要求按照相同的格式输出A+B的结果。 设置一个map<int, double>用于存储幂次及对应的系数,最后非零项不输出即可。要注意的有两个地方,①最后要求降幂输出,而map默认的是按 key 值的 less<T> 方法存储的,也就是升序, 因此必须在声明map时加上排序方法是 greater<...原创 2019-08-24 10:08:22 · 150 阅读 · 0 评论 -
PAT A1003 Emergency (25 分) 图 Dijkstra算法
题目大意:给出一张图,求从起点S到终点D的最短路径的条数,并且求出在这些最短路径中能达到的最大的点权之和。 常规的dijkstra求最短路径,然后用dfs得到最大的点权和及最短路径数。AC代码如下:#include <iostream>#include <vector>#include <algorithm>#include &...原创 2019-08-24 10:13:18 · 106 阅读 · 0 评论 -
PAT A1004 Counting Leaves (30 分) 树的遍历
题目大意:给出一棵树中所有的非叶子节点,以及它们子节点的序号,要求输出每一层的叶子节点的个数。 和层数有关自然想到的是层序遍历,不过DFS也可以做。输入时记录所有非叶子节点的下标,层序遍历时根据是否是非叶子节点来更新每一层的叶子节点的个数,并记录最大层数。 如果用DFS,则递归到叶子节点时进行处理。AC代码如下:BFS:#include <iostr...原创 2019-08-24 10:49:23 · 169 阅读 · 0 评论 -
PAT A1005 Spell It Right (20 分) 字符串
题目大意:给出一个字符串,计算所有数字的和,并将每一位用对应的单词输出。 先算和再对应输出每一位即可。AC代码:#include <iostream>#include <vector>#include <algorithm>#include <cstdio>#include <cmath>#inclu...原创 2019-08-24 11:05:16 · 111 阅读 · 0 评论 -
PAT A1006 Sign In and Sign Out (25 分) 字符串
题目大意:给出每个员工的签入签出时间,输出签入最早的员工和签出最晚的员工。 开始时定义最早的时间是23:59:59, 最晚的时间是 00:00:00,输入过程中进行更新并记录最早和最晚的员工即可。AC代码如下:#include <iostream>#include <vector>#include <algorithm>#inc...原创 2019-08-24 11:39:14 · 134 阅读 · 0 评论 -
PAT A1007 Maximum Subsequence Sum (25 分) 最大子序列和
题目大意:计算给定序列的最大子序列和,并输出这个最大子序列的首尾元素,如果有多个最大子序列存在,输出第一个。注意,如果序列中所有的元素都是负数,那么输出0,以及整个序列的首尾元素。 使用在线处理方法计算最大子序列和,即当前和子序列和为负数时,直接置子序列和为0,并从下一个元素开始。同时还要记录子序列的首尾元素,尾元素只需要在更新最大和的时候记录即可,而当前子序列的首元素则需...原创 2019-08-24 12:42:42 · 159 阅读 · 0 评论 -
PAT A1008 Elevator (20 分) 模拟
题目大意:给出电梯要到的楼层号序列,以及电梯上一层、下一层、停留所需的时间,输出总的时间。 坑点有两个,①第一个数是序列的元素个数,不是楼层号;②如果当前楼层和下一个楼层相同的话,也要加上停留的时间。AC代码如下:#include <iostream>#include <vector>#include <algorithm>#i...原创 2019-08-24 13:03:28 · 132 阅读 · 0 评论 -
PAT A1009 Product of Polynomials (25 分) 模拟
题目大意:给出两个多项式A B,计算 A*B的结果,并以(指数,系数)对的方式输出。 与 PATA1002 计算两个多项式的和类似,用map<int, double, greater<int>>来按降幂存储多项式A,然后在输入多项式B的同时进行计算。由于是乘法,多项式B的每一项都要与A的所有项相乘,因此另外设置一个map来存放结果多项式。最后遍历结果多项式...原创 2019-08-24 13:20:25 · 151 阅读 · 0 评论 -
PAT A1010 Radix (25 分) 二分法 进制转换
题目大意:给出两个数N1和N2,以及其中一个数的进制radix,找到能够使N2 = N1的另一个数的进制。 首先将已知进制的数,假定为N1,换算到十进制下。然后考虑N2的进制radix2,显然radix2的下界是确定的,是N2中最大字符对应的数+1。如果用直接从下界开始往上遍历的暴力方法做的话,测试点7(1分)会超时。考虑用其它的搜索方式,也只有二分了。但是二分需要确定开始的上界...原创 2019-08-24 15:29:31 · 238 阅读 · 0 评论 -
PAT A1011 World Cup Betting (20 分) 模拟
题目大意:给出三行数,每行三个数,找到每行中最大的元素和对应的下标,并按照要求输出。 没什么思想,按要求输出就好了,题目文字太多我也没耐心仔细看了。 #include <iostream>#include <vector>#include <algorithm>#include <cstdio>#includ...原创 2019-08-25 08:39:25 · 147 阅读 · 0 评论 -
PAT A1012 The Best Rank (25 分) 排序
题目大意:给出学生的 id、c(计算机成绩)、m(数学成绩)、e(英语成绩),要求输出指定 id 学生的最佳排名,也就是该学生在 a(平均成绩) 和 c、m、e的四个排名中最佳的,如果有多项有重复的排名,按照 a c m e的优先级选择优先级最高的一项。 常规排序题,只不过要按照 a c m e四个尺度分别排名,排序用vector, 存储用map, 对于指定id,先判断是否在ma...原创 2019-08-25 08:39:30 · 134 阅读 · 0 评论 -
PAT A1013 Battle Over Cities (25 分) 图连通块
题目大意:给出图的信息,如果删除指定的顶点,求对于剩余顶点,至少需要加入多少条边才能使图连通。 关键在于想到至少需要新增的边数就是当前连通块的个数 - 1。统计当前连通块的个数用 dfs方法和bfs方法都可以,与常规问题不同的是要删除指定的顶点,也就是遍历到该节点时跳过即可。AC代码:DFS:#include <iostream>#include <...原创 2019-08-25 08:39:34 · 169 阅读 · 0 评论 -
PAT A1014 Waiting in Line (30 分) 模拟
题目大意:银行有N个窗口,每个窗口最多排队M个人。假设有K个人都从8:00开始等待办理业务,并给出处理每个人业务的时间。前 N * M个人依次在N个窗口前排队,后面的人按照顺序,只有在某个窗口有空出位置时(人数小于M时),到该窗口排队。如果有多个窗口同时空出,选择序号小的。求出每个人结束业务的时间,注意如果某个人在17:00前还没有开始办理业务的话,他就不能办理业务了。 ...原创 2019-08-25 08:39:38 · 303 阅读 · 0 评论 -
PAT 1015 Reversible Primes (20 分) 素数
题目大意:给出一个十进制数N和进制radix,如果N本身在十进制下是素数,同时,N在radix进制下的表示,经过翻转,再转换到十进制下也是素数,则称N是进制radix下的可翻转素数。 本身没什么难度,题意非常绕,究竟是N在radix下的表示是素数,还是N在radix下的表示再转换到十进制下是素数这一点,说的不太清楚。测试用例中,23在2进制下被认为是可翻转素数,那么因为23的二进...原创 2019-08-25 09:13:14 · 115 阅读 · 0 评论 -
PAT A1017 Queueing at Bank (25 分) 模拟
题目大意:银行有K个窗口,给出N个人的到达时间和办理业务需要的时间,银行从8:00开始营业,求出每个在17:00前到达的人的平均等待时间。每个人的业务时间不能超过1h(事实上没有测试点对应这句话)。 一开始是想把时间全部折算成从8:00开始计算的分钟的,但是这样到最后double和int很容易弄混,弄混了精度就丢失了,导致测试点5始终过不了,所以还是全部折算成从8:...原创 2019-08-25 11:03:55 · 143 阅读 · 0 评论 -
PAT A1018 Public Bike Management (30 分) Dijkstra算法
题目大意:给出一张图,图上节点0代表自行车中心,节点1~N代表自行车站。每个自行车站有最大容量C,最佳状态是自行车数量为C/2。现在从节点0到达某个节点,求出最短的路径,同时,调整在这一路径上的每一个自行车站,使它们的数量都达到最佳。如果最短路径有多条,输出需要从节点0带出的自行车数量最少的一条,如果这样的最短路径仍有多条,输出最后需要带回节点0的自行车数量最少的一条。 ...原创 2019-08-25 11:20:29 · 128 阅读 · 0 评论 -
PAT A1019 General Palindromic Number (20 分) 进制转换
题目大意:判断N在base进制下的表示是否是回文数。这里,0<N<1e9,2<base<1e9。 坑点在于base可能大于十,也就是N在base下的表示每一位可能不是0~9的数,例如,1000的11进制表示,是 8 2 10。所以不能用字符串存储,而应该用vector<int>来存储N的base进制的表示。然后判断vector<int&g...原创 2019-08-25 12:35:05 · 110 阅读 · 0 评论 -
PAT A1020 Tree Traversals (25 分) 二叉树遍历
题目大意:给出二叉树的后序和中序遍历序列,输出层序遍历结果。 常规问题,先建树再遍历即可。AC代码如下:#include <iostream>#include <vector>#include <cstdio>#include <queue>#include <cstring>using names...原创 2019-08-25 12:49:28 · 123 阅读 · 0 评论 -
PAT A1021 Deepest Root (25 分) 树遍历 DFS
题目大意:给出N个顶点和N-1条边,先判断是否是树,如果是树,输出能让树的高度最大的根节点。如果不是树,输出连通块的个数。 核心问题是怎样得到让树的高度最大的节点。首先任意选择一个顶点为根节点,然后DFS遍历到叶子节点,这些节点都是满足题意的解。然后从这些节点中任选一个作为根节点,再进行DFS遍历到叶子节点,这些叶子节点也都是解。最后的解是二者的并集。因为有集合的概念,用set&...原创 2019-08-25 13:13:42 · 130 阅读 · 0 评论 -
PAT A1024 Palindromic Number (25 分) 大数加法
题目大意:判断一个不超过10^10的数N,能否在K步内通过加上自身的反转数变成回文数。 与A1023 Have fun with Numbers 相同,依然是大数加法,用vector<int>存储并按照要求反转相加,判断回文即可。 坑点在于开始的输入时,N 要设置成long long型,设置成 int 型会溢出导致测试点7和8运行超时。 或者直接用...原创 2019-08-26 10:24:01 · 219 阅读 · 0 评论 -
PAT A1023 Have Fun with Numbers (20 分) 大数加法
题目大意:给出一个不超过20位的整数,判断它的两倍的结果是否是原有的数字的一个排列。 unsigned long long 最多表示到 2^64 - 1,小于 10^20,所以要用大数加法的方式去得到两倍的结果,存储在vector<int>中,然后将原数和两倍分别排序,比较排序后的两个vector是否相同即可。AC代码如下:#include <iost...原创 2019-08-26 10:24:06 · 136 阅读 · 0 评论 -
PAT A1022 Digital Library (30 分) 字符串
题目大意:给出N本书的信息,包括标题、作者、关键字等等,要求根据查询的关键字输出对应的书的id。 没什么算法思想,信息和id之间的对应用map即可,主要问题在①同一个信息可能对应多本书,因此可以用set或者vector来存储书的信息,即map<string, set<string>>或map<string, vector<string>&...原创 2019-08-26 10:24:10 · 158 阅读 · 2 评论 -
PAT A1025 PAT Ranking (25 分) 排序
题目大意:给出N个考场的所有考生的信息,要求按照成绩排名,输出每个考生的 总排名、考场排名、和所在考场。 排序题,输入完每个考场的考生信息时,可以一次排序得到该考生的考场排名,输入完全部考场信息后再来一次排序,可以得到所有考生的总排名。AC代码:#include <iostream>#include <vector>#include <...原创 2019-08-26 11:10:57 · 153 阅读 · 0 评论 -
PAT A1027 Colors in Mars (20 分) 进制转换
题目大意:将小于169的十进制数转换成13进制数,不足两位的补零。 进制转换问题,直接转换即可。AC代码:#include <iostream>#include <algorithm>using namespace std;string toThirteen(int dec){ string str; if(dec...原创 2019-08-26 15:31:05 · 107 阅读 · 0 评论 -
PAT A1029 Median (25 分) 中位数 归并
题目大意:给出两个分别不超过2*10^5的升序序列,要求找出它们合并后的序列的中位数。内存限制1.5MB。 因为内存限制太小,不能同时存储两个序列,只能存储第一个序列,然后再读入第二个序列,在读入的同时进行合并操作,直到找到应当是整个序列的中位数的位置的数位置。 注意点:①若序列的长度为N,则中位数的位置是(N+1)/2,从下标为1开始计。②若第一个序列的当前位置小于正...原创 2019-08-26 16:24:57 · 132 阅读 · 0 评论