![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
pat二刷
Honcy Ye
EE&&CS
展开
-
【PAT-A1100】Mars Numbers(进制转换)
【题意】是一个10进制和13进制转换的问题。依次给出N(<100)个输入,可能是10进制数,也可能是13进制的表示(取值为[0, 169)也就是13进制最多两位,但也可能为1位)0到12分别在13进制中对应 “tret, jan, feb, mar, apr, may, jun, jly, aug, sep, oct, nov, dec”但是要注意,除了最低位,更高位的数字不是用这1...原创 2019-08-29 20:32:56 · 177 阅读 · 0 评论 -
【PAT-A1080】Graduate Admission(排序)
【题意】一个模仿考试排名和志愿录取的流程。共N个考生,M所学校,每个考生有K个志愿。先给考生按照平均成绩排名,平均成绩相同就按照笔试成绩排名,还相同的话排名就一致。然后按照排名顺序对每个考试进行录取,每个学校都有录取名额,依次考生的每个志愿,如果当前志愿学校还有名额就录取,否则看下一个学校,如果全部志愿都没能录取,就不能录取。另外,如果多并列的人报了同一所学校,而且这所学校只剩最后一个名额的话...原创 2019-09-03 15:21:17 · 163 阅读 · 0 评论 -
【PAT-A1057】Stack(找第序列第K大,分块法or树状数组+二分)
【题意】给栈stack加一个除了push和pop外的操作peekMedian获取中位数。【分析】值得注意的是,由于这里是动态查询,即在每次peekMedian之间序列可能会由于PUSH和POP操作变化,所以用简单的排序后直接获取操作复杂度会很大,因为每次序列变化后都要重新排序。而动态查询序列第K大问题通常采用分块法O(n√n)或者树状数组+二分的方法O(logn*logn)显然通常情况后者...原创 2019-09-03 19:38:53 · 183 阅读 · 0 评论 -
【PAT-A1040】Longest Symmetric String(DP or string hash)
【分析】最长回文子串问题。有DP和字符串hash两种方法。字符串hash先求出字符串hash数组H1[],再将字符串反转,求出其字符串hash数组H2[].对回文子串长度分奇偶讨论:奇数时,枚举回文子串中心点i,二分回文子串半径k,找到最大的使子串str[i - k]~str[i + k]是回文子串的半径k。而判断子串str[i - k]~str[i + k]是回文子串的方法就是:...原创 2019-09-03 22:57:00 · 113 阅读 · 0 评论 -
【PAT-A1068】Find More Coins(DP)
【题意】有N枚硬币(可以有面值相同的),给出每枚硬币的面值,然后要求用这些硬币去支付价值M的物品,要求选出来支付的硬币面值之和必须为恰好等于M。要求按照递增顺序输出选出硬币的面值,如果答案不唯一,那么输出字典序最小的一组,如果无解,则输出"No Solution"。【思路】这是一个典型的01背包问题,只不过这里的同一面值硬币可以有多个,但是又不是无限个,所以可以把所有同一面值的硬币都看看成...原创 2019-09-05 21:31:34 · 285 阅读 · 0 评论 -
【PAT-A1045】Favorite Color Stripe(LCS)
【分析】这题是最长公共子序列问题(子序列不一定连续,而且允许公共部分有重复元素)给出的目标子序列每个元素是独立的,没有重复。但是从被匹配的总的序列中,子序列不一定连续,而且允许公共部分有重复元素。比如总序列为 {2 2 4 1 5 5 6 3 1 1 5 6}目标序列为{2 3 1 5 6}匹配出的四种情况{2 2 1 1 1 5 6}, {2 2 1 5 5 5 6}, {2 2 1 ...原创 2019-09-05 23:27:53 · 140 阅读 · 0 评论 -
【PAT-A1007】Maximum Subsequence Sum(DP)
【分析】最长连续子序列和问题。经典问题。dp[i]代表以i号元素结尾的最长连续子序列和。注意读题,题目说明了全部元素为负的处理方法。一定要认真读完题目的每一个字并确保理解之后再开始解题,否则以为节省了时间,反倒会因此浪费大量时间。【代码】#include <cstdio>#include <algorithm>#include <cmath>usi...原创 2019-09-06 14:08:47 · 101 阅读 · 0 评论 -
【PAT-A1030】Travel Plan(最短路径)
【分析】典型的最短路径问题。以边权作为第二标尺,要求所有最短路径中第二标尺和最小的路径。注意点就是Dijkstra和DFS函数的书写。Dijkstra里执行n次的总循环不要弄错了。【代码】#include <cstdio>#include <algorithm>#include <vector>using namespace std;const...原创 2019-09-06 15:16:47 · 111 阅读 · 0 评论 -
【PAT-A1018】Public Bike Management(dijkstra + DFS最短路)
【分析】这题题意不是很清楚,有题目理解上的陷阱,因为题目没有说得很清楚。主要就是在题目说明部分,说当最短路不唯一时,选从控制中心带去自行车数最小的那条路。而在输出说明部分,又说不唯一时选从目的地带回自行车最少的路径。这个问题的一种解释就是,因为在题目说明部分并没有说那样的选择方法选出来的就一定保证是唯一的,而在后面那种选择标准后题目说明是唯一的,那么选择标准应该就是先按第一种标准选,再按...原创 2019-09-06 18:08:50 · 197 阅读 · 0 评论 -
cin、cout关闭同步提高速度
cin的速度比scanf慢很多。cin慢的原因主要在于默认cin与stdin总是保持同步, 这一步是消耗时间大户.只需要加上std::ios::sync_with_stdio(false)来关闭同步就好了, 速度甚至要优于scanf....原创 2019-09-06 19:28:41 · 1297 阅读 · 0 评论 -
【PAT-A1103】Sum of Number Segments(DFS)
【分析】这题类似于01背包问题,我这里用DFS的递归方法遍历所有情况,并加上了剪枝。同时参考别人的方法,可以考虑用“打表”记录各个数的p次方的表,这样可以避免重复计算,降低复杂度,避免倒数第二个测试点超时。【代码】#include <cstdio>#include <cmath>#include <iostream>#include <vect...原创 2019-09-10 09:39:52 · 117 阅读 · 0 评论 -
【PAT-A1102】Invert a Binary Tree(二叉树的遍历)
【分析】这题就是简单的二叉树遍历,invert的话,只要输入的时候把左右孩子调换一下即可。#include <cstdio>#include <algorithm>#include <queue>#include <vector>using namespace std;struct Node { int data; int lchi...原创 2019-09-10 09:46:42 · 138 阅读 · 0 评论 -
【PAT-A1101】 Quick Sort(two pointers)
【分析】这题其实也不难也可以算DP题,但就是要找清楚方法。开始的时候的想法是直接排序,然后选排序后位置没变的元素,但是其实这是想当然了,排序后位置没变的元素必然满足题目条件,但是题目要求是原始序列满足条件。因此,这题还是要用别的方法。用pre[i]表示i号位及以前的元素中的最大值,post[i]表示i号位及以后的元素中的最小值。如果pre[i]和post[i]相等就说明满足条件。【代码】#...原创 2019-09-12 20:19:03 · 80 阅读 · 0 评论 -
【PAT-A1108】Finding Average(字符串处理)
【分析】这题主要考察字符串的处理,主要学会用字符串string和其他基本数据类型的转换函数比如stod,stoi (string头文件)。以及判断字符的函数isdigt() isalpha()(cctype)这里遇到一个注意点,就是ios::sync_with_stdio(false);这个取消与stdio同步的语句,如果加了,cin就不要与scanf等函数同用,最好都用cin,否则很可能会...原创 2019-09-12 20:34:52 · 121 阅读 · 0 评论 -
【PAT-A1109】Group Photo
【题意】N个人拍照的时候排阵形,共K排,前面每排N/K人,有多的都放最后一排。后排的人身高不能比前面的任意一个人矮,同时每排中间的人最高,两边身高依次下降。身高相同的按照名字的字典序排。给出每个人的姓名和身高,输出最终排列的名字阵形。【代码】#include <cstdio>#include <algorithm>#include <iostream>...原创 2019-09-14 15:39:21 · 130 阅读 · 0 评论 -
【PAT-A1110】complete binary tree
[分析】这题就是完全考完全二叉树定义和性质的一道题。主要还是定义:对于深度为K的,有n个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一一对应时称之为完全二叉树。所以判断二叉树是否为完全二叉树,就要获取其对应满二叉树的顶点编号的信息。容易想到用层序遍历二叉树就能给顶点编号,开始时,我采用在顶点出队的时候给顶点依次递增编号,后来发现这样其实是不对的,因为只有存在的...原创 2019-09-20 16:04:47 · 112 阅读 · 0 评论 -
【PAT-A1081】Rational Sum(分数运算)
【题意】就简单的分数加法运算,之前做过一题更难的。不过这里就是要注意输入得到的值不标准,要reduction一下,而且明白了reduction中为什么在分数为0的时候把分母设为1,这是因为0参与的加减法运算不会错。【代码】#include <cstdio>#include <algorithm>using namespace std;typedef long l...原创 2019-09-02 19:47:04 · 136 阅读 · 0 评论 -
【PAT-A1082】Read Number in Chinese
【分析】这题没有考察什么特定的经典算法。但是要考虑的很全面,细节很多,需要从一开始就规划好思路,不然贸然开始很可能会考虑不全面。【思路】首先,按照通常的中文习惯,是四位为一节来划分的。这里最多为9位,所以最多到亿。符号好解决,只要特殊判断一下就行。从最高位开始遍历每一位,同时记录它从最低位开始的位数,4位为一节,第三节后面要加一个“Yi”,第二节后面要额外加一个“Wan”,第一节后面不...原创 2019-09-02 17:36:20 · 129 阅读 · 0 评论 -
【PAT-A1083】List Grades(排序)
【分析】这题就是简单的排序。没什么难度。【代码】#include <cstdio>#include <algorithm>#include <iostream>using namespace std;const int maxn = 110;struct Record{ char name[12]; char ID[12]; int gr...原创 2019-09-02 15:17:00 · 108 阅读 · 0 评论 -
【PAT-A1099】Build A Binary Search Tree(二叉查找树)
【题意】规定BST左孩子小于当前结点,右结点大于等于当前结点。给出一个树结构(静态)以及一个结点权值序列,要求构建出BST然后输出其层序遍历的序列。【思路】注意这题不是直接按照权值序列创建BST,而是先给出二叉树结构创建好二叉树再填入权值,最后层序遍历。填入权值可以先将序列小到大排序,再中序遍历BST的同时依次填入序列权值。【代码】/*1. 构建BST,写createBST(Node ...原创 2019-08-29 21:57:27 · 126 阅读 · 0 评论 -
【PAT-A1097】 Deduplication on a Linked List(静态链表)
【题意】给出一个静态链表,将所有相同绝对值的结点的重复结点按顺序从原链表剔除,被剔除的结点按顺序再组成一条链表,依次输出去重后的链表和重复结点组成的链表。【思路】先按照输入创建初始链表再次遍历链表,同时对首次出现的绝对值结点的hash值置为true。并重新设置其next,这个设置需要得到该链表末尾的结点地址,所以可以用一个变量记录一下。hash值为true的绝对值的结点为重复结点。和非...原创 2019-08-30 14:34:24 · 326 阅读 · 1 评论 -
【PAT-A1096】Consecutive Factors(连续因子, 暴力)
【注意点】测试点3不过反例:n = 234537当解到2345后,发现6不行,当前最长的长度为4这里的算法直接从7开始往后。但是如果从3开始34567是可行的,所以实际忽略了这种情况应该每次只走一步。我开始写的算法在发现6不行后就直接从7开始了。【代码】#include <cstdio>#include <algorithm>#include <c...原创 2019-08-30 16:04:55 · 181 阅读 · 0 评论 -
【PAT-A1095】Cars on Campus(排序的灵活应用)
【题意分析】这题技巧性比较强,而且数据量比较大,容易超时。首先冗余的不合法数据的剔除比较难进行,这题巧妙地利用排序,以车牌号字符串作为第一排序准则,将不同车辆的信息分开,每个车牌的信息再按照时间升序排列。这样就可以容易地选出成对的记录剔除无效记录。另外,就是查询部分,先将所有合法的成对记录按照时间排序,然后这里如果每个查询都遍历一次所有有效信息,那么测试点4会超时。这里可以巧妙利用查询的时...原创 2019-08-30 22:35:51 · 199 阅读 · 0 评论 -
【PAT-A1094]】The Largest Generation(树的遍历)
【分析】对于简单的树遍历,DFS和BFS都可以,这题在遍历的同时还要设置层号,可能第一感觉是只有BFS可以,但是实际也是两者都可以。【注意点】这题的注意点就是,...原创 2019-08-31 09:33:04 · 120 阅读 · 0 评论 -
【PAT-A1093】Count PAT's(技巧题)
【分析】这题要求复杂度在O(n),也就是只能遍历整个字符串一次,所以要注重技巧。可以统计每个’A’左边’P’的个数和右边’T’的个数,两者相乘就是这个A的PAT的个数,再将所有A算出来的值求和即可。【代码】#include <cstdio>#include <iostream>#include <vector>#include <unorde...原创 2019-08-31 10:06:40 · 125 阅读 · 0 评论 -
【PAT-A1092】To Buy or Not to Buy(hash)
【分析】这题比较简单,简单地用map就能解决。【代码】#include <cstdio>#include <unordered_map>#include <algorithm>#include <iostream>using namespace std;int main() { unordered_map<char, in...原创 2019-08-31 10:41:21 · 100 阅读 · 0 评论 -
【PAT-A1091】Acute Stroke(图的遍历,三维)
【题意】给出一个三维的图,求其中块的大小大于阈值的连通块的个数。三维图的给出方式为先给出每层的长宽(M*N)和层数(L)以及阈值(T),再依次给出L层的01矩阵。【思路】就是简单的图的遍历DFS和BFS均可,遍历的同时求出满足阈值的连通块数目。【注意点】这里我开始用的是DFS后来发现这里再在数据量大的时候DFS容易由于递归太深而爆栈,所以以后遇到这种数据量大的题还是最好用BFS保险。...原创 2019-08-31 15:04:48 · 161 阅读 · 0 评论 -
【PAT-A1090】Highest Price in Supply Chain(求树的最大深度并)
【分析】求树的最大深度并要求记录最大深度的结点数量。注意处理只有一个根结点的情况【代码】#include <cstdio>#include <vector>#include <queue>#include <cmath>using namespace std;const int maxn = 100010;int n, root...原创 2019-08-31 15:55:05 · 66 阅读 · 0 评论 -
【PAT-A1089】 Insert or Merge(排序算法)
【分析】这个题目总体方法和前面的一题一样,这里主要分析merge排序。这次我在做这题时采用的是递归的方法,但是发现我的递归算法结果正确,但是过程并未出现题目的中间结果。当序列元素不等于二的幂次时,采用递归和非递归的两种方法的中间过程是不一样的,即它们分组的的情况是不一样的。对于非递归的算法,每组的元素数依次是2的各次幂。二采用递归的方式由于是一层一层地划分整个序列,所以每次的组的元素为上...原创 2019-08-31 19:19:51 · 179 阅读 · 0 评论 -
【PAT-A1088】 Rational Arithmetic(分数运算)
【分析】除了基本的分数化简和四则运算,还要考虑分数假分数和带分数的转换与输出。【注意点】约分reduction时,gcd要加绝对值分数的分子分母相乘的时候两个int相乘容易超界,所以全部用long long假分数和带分数的转换输出可以先用假分数的分子分母判断,再转换输出,而不是直接得到整数部分再判断整数部分,那样情况太多。【代码】#include <cstdio>#...原创 2019-08-31 23:06:19 · 194 阅读 · 0 评论 -
【PAT-A1087】 All Roads Lead to Rome(带第二标尺的dijkstra最短路)
【分析】这题就是典型的带第二标尺(幸福度)和第三标尺(平均幸福度)的最短路径,同时要记录最短路径并输出。做这题又复习了一遍Dijkstra算法。算法题就是在理解的基础上训练的结果,每次在问题中回顾都会有新的收获,对于这类问题和算法的理解也会更深刻。开始没太仔细思考平均幸福度这一标尺,就用单纯的Dijkstra算法求解,后来才发现平均幸福度不太容易随着求解过程更新,因为平均是对整条路平均,所以...原创 2019-09-01 14:54:21 · 158 阅读 · 0 评论 -
【PAT-A1086】Tree Traversals Again(二叉树重建)
【分析】这道题就是典型的二叉树重建和遍历。从中序遍历的出入栈操作,得到先序序列和中序序列,重建树结构,再得到后序序列。【代码】#include <cstdio> #include <iostream>#include <string>#include <vector>#include <stack>using namesp...原创 2019-09-02 10:21:00 · 121 阅读 · 0 评论 -
【PAT-A1085】Perfect Sequence(two pointers)
【题意】给出N个10^5以下的正整数组成的序列,找出能使M <= m*p成立的最大序列元素数,其中M是目标序列的最大值,m为最小值。【思路】考虑到时间限制为200ms,N的最大值为10^5 所以时间复杂度不能超过 10^6量级即O(nlogn)的复杂度。首先对序列进行排序,复杂度O(nlogn)然后用two pointers两个指针分别指向最大值和最小值,然后判断M <...原创 2019-09-02 11:36:03 · 129 阅读 · 0 评论 -
【PAT-A1084】Broken Keyboard(hash)
【分析】这题难度不大,但是在做题过程中遇到一些问题。这里记录一下字符大小写转换函数:单个字符可以用头里的toupper()和tolower()函数。整个字符串可以用头里的transform(str.begin(), str.end(), str.begin(), ::tolower).unordered_map在用迭代器遍历的时候,它的顺序并不是插入元素的顺序,因为它的原理是用hash....原创 2019-09-02 14:49:47 · 150 阅读 · 0 评论 -
【PAT-A1155】Heap Path(二叉树遍历)
【题意】给出一个完全二叉树的层序遍历序列,判断其是大顶堆、小顶堆还是不是堆。【思路】因为通常我们静态存储二叉树在数组中也是以层序存的。所以可以直接读入序列存在数组中。输出路径:先序遍历(不过注意要先访问右子树再访问左子树)用vector保存路径,边界时输出路径。判断是否为堆:从路径的第二个结点开始遍历若有比父结点小的,就不是小顶堆;若有比父节点大的就不是大顶堆;若两者都不是,就不是堆。...原创 2019-10-07 20:33:33 · 125 阅读 · 0 评论