![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
PAT刷题日记
文章平均质量分 91
克莉斯丁
正在努力成为合格的独立游戏开发者!
展开
-
PAT(甲级)2019秋 Forever【最大公约数】
“Forever number” is a positive integer AAA with KKK digits, satisfying the following constrains:the sum of all the digits of AAA is mmm;the sum of all the digits of A+1A+1A+1 is nnn; andthe greatest common divisor of mmm and nnn is a prime number which原创 2020-08-30 16:24:52 · 249 阅读 · 1 评论 -
PAT A1119 Pre- and Post-order Traversals【先序遍历、后序遍历求中序遍历】
这道题给出前序遍历、后序遍历,要求你求出中序遍历。我的思路是:根据前序遍历和后序遍历建树,然后中序遍历,求出答案。那么如何建树呢?从左到右遍历前序遍历数组中的全部节点,对于当前节点,检查它和上一个节点之间的关系。关系可以分为两大类:如果当前节点的后序遍历下标在上一个节点的左边,那么当前节点是上一个节点的子节点。那么,是左儿子还是右儿子呢?如果在后序遍历序列中,当前节点的下标等于上一个节点的下标减一,那么不确定是左儿子还是右儿子,树不唯一,在我的算法中,统一都设为左儿子,这对后续计算有帮助。如原创 2020-08-18 20:46:45 · 137 阅读 · 0 评论 -
PAT A1117 Eddington Number
这题的题意太难看懂了orz这题要寻找一个数字E,表示骑行了E天,且这E天每一天骑行的长度都大于E这个数字,求所有满足该条件的E中最大的那个数字。我思考了很久,加了好多条件才求出来,我看别人的代码又短,思路又清晰,唉以下是思路:首先,所有的数字从小到大排序,且求出minn[i],表示第一个大于a[i]的数的下标。如果没有这样的数字存在,就设置为n+1。接着,从前往后遍历每一天,假设每一天的公里数都是待选的E,看看这些E是否满足条件。判断它们是否满足条件的方法就是,看大于它们的天数是否等于它们本身。原创 2020-08-18 16:49:29 · 94 阅读 · 0 评论 -
PAT A1108 Finding Average【状态机】
这道题的大意是让你求平均数,然而,输入中会包括一些不合法的数,这些数不能参与平均数的计算。这些不合法的数包括根本不是实数的字符串,以及虽然是实数,但是大小不在[-1000,1000]之内的数和小数位数超过2的数。我这道题很快就做出来了,为什么要写一篇日记记录一下,是因为我在做这道题的时候应用了编译原理课上状态机处理常数的思想,利用状态机先判断当前的字符串是否是实数,如果是,再判断大小。这并不是什么算法知识,但是我个人感觉这种思想以后还会用到,因此记录一下。除此之外,c++还有一个新特性被我应用了,那就是原创 2020-08-15 21:43:24 · 92 阅读 · 0 评论 -
PAT A1104 Sum of Number Segments【思维+踩坑】
这道题是一道简单的思维题,把情况都列出来,就可以轻松地找到其中的规律。但是我提交了之后,一直WA一个点,百思不得其解,后来听别人说,开到long double就可以了。我还是第一次听说long double,顺便记录一下long double如何用scanf输入:scanf("%Lf",&ans);下面是本题的AC代码:#include <iostream>#include<vector>#include<cstdio>#include<algori原创 2020-08-15 21:22:12 · 130 阅读 · 0 评论 -
PAT A1150 Travelling Salesman Problem【模拟】
这道题虽然是以TSP问题作为背景,但是不需要任何TSP算法的知识,只要按照题目模拟即可。在做题的时候,最重要的就是要细心,这道题情况有很多种,要把所有的情况都依次划分出来。我一开始WA了一个点,检查之后,发现是当我判断是否所有的点均被访问的时候,并没有判断1到n的所有点,而是判断了存储路径数组里的点是否被访问过,这样一来,就根本不会有没有访问过的点了。修复了这个问题之后,终于AC了,开心!代码最下方的注释里面写了那个检查出我的错误的数据。#include <iostream>#inclu原创 2020-08-14 11:43:49 · 126 阅读 · 1 评论 -
PAT A1151 LCA in a Binary Tree【树的遍历】
这道题虽然是让我们求最近公共祖先,但是并不需要用什么倍增之类的复杂算法解决,而是采用递归遍历的方式即可。解决这道题之前,我也没什么思路,先看了看柳神的博客,一下子恍然大悟,这道题其实并不难。这道题的思路是,根据先序遍历和中序遍历给出的数组,递归建树,在建树的过程中,如果两个点一个点位于当前树根的左边,另一个位于右边,则当前树根就是要求的LCA。注意,这里的“左边”“右边”指的是在中序遍历序列中的左右,因为中序遍历是以左子树-根-右子树的方式遍历的。如果两个点均位于左边,那么LCA肯定在当前根节点的左子树,原创 2020-08-13 13:03:36 · 137 阅读 · 0 评论 -
PAT A1153 Decode Registration Card of PAT【排序】
这道题要非常细心才行,主要就是给定一些学生的数据,按照给定的指令输出想要的信息,但是这道题我卡了半天才过,具体发生了以下错误:由于c++中的string我非常习惯,而c语言中的char我非常讨厌,这道题我都是把char数组转换为string进行计算处理的。然而,在某个测试点超时了。这是因为我只注意了输入用scanf,没注意输出也要变为printf。我使用了strncpy函数进行字符串拷贝,然而我使用了该函数后,出现了拷贝过来的字符串长度比我想要的更长的现象,后来查询资料,发现这个函数是不会在末尾添加’原创 2020-08-12 18:22:03 · 187 阅读 · 0 评论 -
PAT A1154 Vertex Coloring【图论】
这道题没什么难度,首先要注意把所有的颜色放入set中,方便统计颜色的个数;我第一次尝试使用了unordered_set,听说这个比set更快。然后遍历所有的边,如果这条边连接的两个点颜色相同,则输出No,如果不存在这种情况,则输出颜色的个数。这道题我写完代码之后,没有立刻全对,提交了两次都是全错。这里记录一下犯的错误:面对二重循环,千万不要外围和内围都用相同的变量由于本题是多组数据输入,一定要注意在每一轮开始的时候进行初始化,不要忘记了初始化的过程#include <iostream>原创 2020-08-12 16:22:40 · 85 阅读 · 0 评论 -
PAT A1020 Tree Traversals【dfs+bfs+树的遍历】
这道题是后序遍历转中序遍历,再输出为层次遍历的题,后序遍历转中序遍历参考了算法笔记的做法,要注意的是,在dfs的过程中,cnt的值是可以改变的,所以要提前记录下来;以及,这道题虽然样例里所有的点都在1到n的范围内,但是实际上,并没有说明这一点,所以要记录下来每一个点的数字。#include <iostream>#include<vector>#include<cstdio>#include<algorithm>#include<cmath>原创 2020-08-09 10:46:24 · 84 阅读 · 0 评论 -
PAT A1004 Counting Leaves【dfs+树的遍历】
水题,用邻接表存储树的结构,dfs遍历即可。难点是题干中生词较多,需要花一点时间理解。#include <iostream>#include<vector>#include<cstdio>#include<algorithm>#include<cmath>#include<map>#include<cstdlib>#include<queue>#include<cstring>#i原创 2020-08-09 10:11:18 · 125 阅读 · 0 评论 -
PAT A1119 Group Photo 【链表处理+排序】
这题一开始我蒙了,还以为对于身高相同的元素,要把姓名从左到右从小到大排序,其实并不需要,只要把姓名和身高一起排序就行了。这道题由于对于每一个小组的内部成员,身高都是先处理为降序再进行重新排列的,而后排的同学都比前排的高,所以可以直接对所有的人先进行一次身高升序排序(同时名字降序排序),然后从后往前处理数据,对于每一组,选择这一组元素下标最大的那个元素,因为一开始是身高升序,名字降序,因此下标最大的那个元素一定是身高最高且名字最小的同学,把这位同学送入链表。接下来倒序遍历该小组所有成员,一左一右依次送入链原创 2020-08-09 09:47:27 · 140 阅读 · 0 评论 -
PAT A1087 All Roads Lead to Rome【spfa+dfs+字符串hash】
这道题其实就是一道最短路水题,spfa+dfs+hash,但是写代码和调试花的时间都有点长,记录一下细节,警告自己下次要更加耐心。这道题的地区名字都是字符串,所以可以用map存储字符串和int的对应关系。由于本题既需要通过string寻找int,也需要通过int寻找string,因此我建立了两个map来进行这一操作。当dfs的时候,我找到路径后直接返回了,但是忘记了把最后一个元素清除,因此一开始一直得出错误的结论。一开始我在spfa里进行判断快乐值和最短路径,在dfs里判断平均快乐值,后来改为了在d原创 2020-08-08 13:39:30 · 199 阅读 · 0 评论 -
PAT A1030 Travel Plan【SPFA+输出路径】
本题是一道最短路径水题,和普通最短路径不一样的是,本题不仅要考虑路径长度,还要考虑路径上的花费。除此之外,还要输出路径。考虑路径上的花费比较简单,直接在SPFA的时候添加判断即可,输出路径则在存边的时候开两个数组,一个专门存前驱,一个专门存后继。在最后,倒序遍历,就可以找到唯一的一条最短路径。#include <iostream>#include<vector>#include<cstdio>#include<algorithm>#include&l原创 2020-08-08 12:23:50 · 138 阅读 · 0 评论 -
PATA1018 Public Bike Management【spfa+dfs】
本题是一道spfa+dfs题,难点在于不能在spfa的过程中计算答案,而要计算完所有最短路径之后再进行计算。我做完这道题之后,一直卡在25分,百思不得其解,后来发现居然是题意又理解错了。以后面对英文题目要加倍细心。这道题是我做的第二道spfa模版题,下一道题我决定采用dijskra,两种方法轮流练习熟练。#include <iostream>#include<vector>#include<cstdio>#include<algorithm>#i原创 2020-08-06 16:47:18 · 150 阅读 · 0 评论 -
PAT A1003 Emergency(SPFA+DFS)
这道题我采用了spfa+dfs的思路。最近在备考PAT,打算把这道题当作模版题之一,以后随时拿来复习。这道题注意的要点如下:这道题中不仅要输出救生队最大数目,还要输出最短路径数目,其中救生队最大数目可以直接在spfa中得到,最短路径数目则不可以,因为有可能重复统计,所以需要在dfs中得到。dfs需要从后往前遍历,因此需要记录每个点的前驱。如果采用vector数组实现图的存储,要注意记录前驱和记录后继要采用两个数组a和b,不可以用记录后继的数组遍历前驱。#include <iostrea原创 2020-08-06 15:46:17 · 176 阅读 · 0 评论 -
PAT A1010 Radix(二分法)
这道题真是刷PAT遇到的最毒瘤的题,通过率也只有0.11,大大挫败了我刷题的自信心。。。。。。这道题的思路不是很复杂,是对进制进行二分查找,最后确定符合条件的那个进制数。坑点:本题表面上迷惑了我,让我以为最高就是36进制,事实上并不是这样,假设N1的十进制表示为100,那么N2完全可以是1进制数,一共100位,这样N1也可以等于N2。因此,上界是N1的十进制表示。如果N1和N2看起来就像等,那直接输出radix就行,没必要算下界是N2的最大数位+1,比如,N2=ffffff,那么下界就原创 2020-08-01 12:06:39 · 164 阅读 · 0 评论 -
patA1085 完美数列
这道题一看就知道,是采用二分查找的思路完成。观察题目,可以确定,我们要求的答案(最大整数个数)可以作为二分查找的对象,因为它的值满足:如果当前的答案满足条件,那么最优的答案一定大于或等于当前答案;若不满足条件,那么最优的答案一定小于当前答案。首先对全部数据进行排序,然后初始化l=1,r=n,进行二分求解。判断mid是否满足条件采用O(n)直接遍历,假设每一个数字均是最小值,确定对应的最大值(假设最小值下标为i,最大值下标一定为i+mid-1),并且判断二者是否满足M<=m*p这个条件,如果满足,直接原创 2020-08-01 09:51:46 · 110 阅读 · 0 评论