![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
pat甲级
pessiboy
头号混子,会点C++,会点python,会点java。
展开
-
pat-1105 Spiral Matrix (25分)
这次一次性把螺旋数组,蛇形数组给一锅端。简单的鸭皮啊。其实之前还是很恐惧螺旋数组的。先解决pat的题目如何解决呢?用偏移量法:可能理解上有点小麻烦。力扣上面虽然很多关于题解的,但是我感觉边界性太强了。我不太推荐。怎么使用偏移量法呢?设置方向,螺旋数组是一个顺序的方向。我们定义一个偏移量,attention:这个和dfs的那么迷宫不太一样。顺序访问:右下左上。int dx[]={0,1,0,-1},dy[]={1,0,-1,0}.先贴上代码:#include <bits/stdc++.h&原创 2020-12-04 15:29:30 · 66 阅读 · 0 评论 -
pat-1119 Pre- and Post-order Traversals (30分)
刚好这一题让我的树的理解更加深刻。题目的意思是如果给你先序序列和后序序列是否能够构建出唯一一棵树,如果不能请输出序号最小的,如果可以,那么请输出唯一的那一棵树的中序序列。我们不妨把题目的所以的样子的树给画出来。画出来的结果可能是存在一下两种情况。所以这个树不唯一。我们在其中找出规律,其实里面是存在规律的。这个题目最不好的地方是,判定为no的数字序列给的数据很小,可能找规律好像不太好找。关于的树的先序,中序和后序遍历顺序相信写pat的人应该很熟悉。先序序列的第一个数的为根节点(左子树和右子树.原创 2020-12-03 20:06:35 · 85 阅读 · 0 评论 -
pat-1107 Social Clusters (30分)
大概的意思是统计出集群中点的,以及每一个集群的人数:算法设计:(1)开一个hob数组,数组的下标表示的是爱好的编号。而每一个编号存储的是:喜欢这个爱好的人的编号。(2)然后对每一个小的编号集合里面的人进行种群合并就行了。需要输出种群的数量,以及按照要求从小到大输出种群对应的人数。关于提两点,一个是并查集的初始化,另外是并查集的合并(这里直接给出已经经过路径压缩的并查集合并的板子)**并查集合并如下:**不要问这么多并查集的板子这么写,力扣上面都是这样,相对于晴神的算法比较,我更喜欢这种方式.原创 2020-12-02 22:47:08 · 48 阅读 · 0 评论 -
pat-1143 Lowest Common Ancestor (30分)
一个比较优秀的LCA的解题方法,虽然在复杂度上面可能会有一点点高。看到在解题目上面真的很巧妙。性质用得非常完美。这里我贴上一个关于LCA的专题::LCA专题LCA我所了解的解法,倍增,tarjan等等…但是我还没学过那些算法,所以暂时不写了解题思路:对于题目的要求,我就将题目的前序BST序列先去进行转化(其实更多的是用到了bst的性质去做的):转化后的树的结构是这样的:我们不断去查询,输入u和v。那么存在如下情况,因为bst的性质,左<中<=右。那么显然存在如下表示:(u<.原创 2020-12-02 22:36:38 · 64 阅读 · 0 评论 -
pat-1154 Vertex Coloring (25分)
题目大意:就是先去构建一个图,然后给你一系列顶点。现在判断的是:一条边的两个顶点的颜色是不是不同。如果不同,那么表示的是k着色,且输出元素种类的个数。如果不存在相同输出No。这里推荐使用邻接表,或者结构体直接去存储。因为10000条边,还要复杂度可能在1亿了,而时间给了0.9秒,可能会超时。#include <bits/stdc++.h>using namespace std;int n,m,k;const int N=10010;bool st[N];struct edge{.原创 2020-12-01 12:02:04 · 83 阅读 · 0 评论 -
pat-1069 The Black Hole of Numbers (20分)
感觉我的解答比很多题解都好,嘻嘻就是模板的使用但是需要去做注意一个测试点,如果输出的数字是一个小于1000的数,就是数位小于4,那么就需要自己去使用string的匿名函数去补上前导0代码如下:#include <iostream>#include <string.h>#include <algorithm>using namespace std;int main(){ string str,tmp;cin>>str; while(1){ .原创 2020-11-26 12:54:23 · 3027 阅读 · 0 评论 -
pat-1003 Emergency (25分)
模板题目:第二标尺需要去注意#include <iostream>#include <algorithm>#include <string.h>using namespace std;const int N=510;const int INF=1000000000;int n,m,st,ed,g[N][N],weight[N];//点权int d[N];//记录距离int w[N];//路径的最大的点权和int num[N];//记录最短路径的条数.原创 2020-11-20 22:26:20 · 55 阅读 · 0 评论 -
pat-1030 Travel Plan (30分)
#include <bits/stdc++.h>using namespace std;const int N=510;const int INF=1000000000;int g[N][N],c[N][N],d[N],co[N];//注意c是边权 int pre[N];//保存一个前驱节点,到时候递归去进行遍历 int n,m,st,ed;//城市数,主干道数目,起始城市,终点城市 bool vis[N];void dijkstra(int s){ fill(d,d+N,I.原创 2020-11-20 22:14:38 · 68 阅读 · 0 评论 -
pat-1124 Raffle for Weibo Followers (20分)
简单的散列,如果非要说的话,有点双指针的影子,但不是双指针。检查半天,发现怎么进不去循环。我在输入的时候就已经讲次数全部减掉了,汗(我好蠢)。关于如果抽不到的情况,其实就是打标记,如果抽到了肯定不输出。所有在处理抽到奖的时候。我们顺带去把标记处理一下,也就意味着不用去keep gonging…了代码如下:其实很短,中间检查了很久#include <bits/stdc++.h>using namespace std;unordered_map<string,int> mm..原创 2020-11-18 20:23:36 · 52 阅读 · 0 评论 -
pat-1138 Postorder Traversal (25分)
常规写法,根据前序和中序,然后输出后序遍历就可以了。其实找出第一个点,也可以打标记,不用去查找那么多次。代码如下:简直就是模板啊,根本没脑子,直接码代码#include <bits/stdc++.h>using namespace std;const int N=50000;int pre[N],in[N],n;vector<int> res;struct node{ int data; node* l,* r;};node* build(int .原创 2020-11-15 22:50:39 · 49 阅读 · 0 评论 -
pat-1043 Is It a Binary Search Tree (25分)
题目不难:考察三个点:(1):二叉搜索树的建立:这题代码里面有模板,一定要背呀(2):镜像树:其实就是左右节点去进行翻转(3):注意输出千万要注意,关于符号的问题,一定一定注意,代码是很简单的。几乎就是模板#include <bits/stdc++.h>using namespace std;struct node{ int data; node *l,*r;};//使用插入序列去构建出一颗二叉树,node*是类型,通过&去改变内容 vector<int..原创 2020-11-15 13:00:12 · 55 阅读 · 0 评论 -
pat-1039 Course List for Student (25分)
说实话,有点被晴神的算法笔记误导了。做这题的第一想法当然是stl啦,但是他说map会超时。但是可以去改一下,换成ordered_map。那么就不会产生超时的情况了。通过名字的与课程id进行映射。但是输出的时候注意一下排序就ok了。代码如下:#include <bits/stdc++.h>using namespace std;int main(){ unordered_map<string,vector<int>> stu; int n,m; cin&g.原创 2020-11-11 20:50:43 · 65 阅读 · 0 评论 -
pat-1116 Come on! Let‘s C (20分)
大概去描述一下:就是输入信息的时候,我们根本输入的情况去处理:(如果第一个输出的数字然后输出):cout<<": Mystery Award"<<endl;(如果第一个输入的信息的列表排名是素数):else if(prime(hh[id])) cout<<": Minion"<<endl;(如果输出的数字出现了,那么就):else cout<<": Chocolate"<<endl;(如果上面已经输出过一次了):else i.原创 2020-11-10 09:34:14 · 47 阅读 · 0 评论 -
pat-1113 Integer Set Partition (25分)
直接找出一个不相交的集合a,b.满足min(a,b)且max(sum(a)-sum(b)):不讲了,代码直接自己体会。但是注意一点,accumulate()函数帮你做了加法操作,但是需要去引入合适的头文件才可以。对应的头文件为:#include <numeric>//数学问题#include <iostream>#include <algorithm>#include <numeric>using namespace std;const int.原创 2020-11-10 09:30:20 · 53 阅读 · 0 评论 -
pat-1152 Google Recruitment (20分)
题目意思:先输入两个数a,b;然后输出长度为a的字符串序列。在序列里面去找长度为b的素数的序列。如果找到,那就输出长度为b的字符串序列。如果没有找到,那就输出404说几个坑点,特别特别贴别坑的:for(int i=0;i<=a-b;i++)//边界判断要这么去写//如果写成这样子,那就会出现如下错误,会有一个测试点过不去for(int i=0;i<=str.size()-b;i++)这个特别奇特,都不知道这个测试点怎么就过不去的,我醉了。#include <iostre..原创 2020-11-09 22:24:10 · 62 阅读 · 0 评论 -
pat-1038 Recover the Smallest Number (30分)
题目分析:就是给你一堆的数字字符序列,然后凑出最小的数字,然后输出。注意要点:(1)注意前导零。以及全是0的情况:关于全是0的情况,我使用string的构造函数构造出长度为s.size的全是0的字符串,然后去进行比较。(2)这里非常好非常好非常好的技巧是,cmp的比较函数,一招致命啊!#include <iostream>#include <algorithm>using namespace std;const int N=1e4+10;string str[N].原创 2020-11-09 21:41:26 · 59 阅读 · 0 评论 -
pat-1037 Magic Coupon (25分)
题目简述:其实还是很好理解的:其实就是给你两个序列,然后在序列里面去选数字,序列里面的数字只能够使用一次。然后求出乘积的和的最大值:举个栗子:41 2 4 -147 6 -2 -3那么乘积最大值为:4* 7+26+(-1)(-3)=43这题我倒没有觉得像是贪心的问题,反而就像是一个普通的模拟题:我的处理方式是:分别将两个序列的整数和负数都放在正负数组里面去。然后排序相乘:见我的代码就知道有多容易了:在存储学列的时候需要去注意,我一开始负数里面的数都没有存进去,我还打标记去记录代码.原创 2020-11-09 21:09:09 · 77 阅读 · 0 评论 -
pat-1108 Finding Average (20分)
题目大意:有要求的去求出平均数,剔除出不合法的浮点数。这里提供两种写法:其实最好的办法是:(1)使用字符出的处理利器:sscanf(),sprintf() ,其实类似于字符串的正则处理:(2)自己手动去进行处理:方法一:#include <iostream>#include <string.h>using namespace std;int main(){ int n,cnt=0;//cnt记录的合法的数字出现的次数 char a[50],b[50]; do..原创 2020-11-09 19:42:05 · 93 阅读 · 0 评论 -
pat-1085 Perfect Sequence (25分)
按照题目意思找出序列即可。双指针模拟:#include <iostream>#include <algorithm>using namespace std;const int N=1e5+10;int arr[N];int main(){ int n,p; cin>>n>>p; for(int i=0;i<n;i++) cin>>arr[i]; sort(arr,arr+n); int .原创 2020-11-09 15:10:25 · 51 阅读 · 0 评论 -
pat-1083 List Grades (25分)
又是爽题:知道题目中规中矩的简单:考察知识点:简单排序题目描述:输入学生的信息,然后查找在区间[grade1,grade2]的成绩,如果没有学生在这个区间,那么直接输出NONE。如果有学生在这里面,按照成绩成绩的排序从大到小的输出学生name和id。//就是输出在这个范围成绩的学生//name[1] ID[1] grade[1]#include <iostream>#include <algorithm>using namespace std;const int N..原创 2020-11-09 14:34:18 · 59 阅读 · 0 评论 -
pat-1028 List Sorting (25分)
大意:就是按照题目的规则去排序,pat就是唬人,其实根本没用到链表排序。甚至这题复杂的逻辑性都没有,直接按照他说的逻辑去排序一下就可以了。这里我就不去多讲了,码这题的代码不难,而且也没什么逻辑上的考虑,唯一的地方就是注意输出叭注意要点:最后输出的时候,注意一下保存6为数字,就是考察printf()的格式化输出:#pragma GCC optimize(2)#include <iostream>#include <algorithm>using namespace std..原创 2020-11-09 14:09:43 · 53 阅读 · 0 评论 -
pat-1055 The World‘s Richest (25分)
算法考察:排序:大概描述一下题意:就是输入信息,然后我们接下来查询某个范围年龄的富豪就可以了。然后按照格式去进行输出:#include <iostream>#include <algorithm>#include <string>using namespace std;const int N=1e5+100;struct Person{ string name; int age,val;}p[N];bool cmp(Person a,..原创 2020-11-09 14:05:52 · 43 阅读 · 0 评论 -
pat-1031 Hello World for U (20分)
字符串模拟:首先是去进行计算:n1+n2+n3=N+2n1=n3n1<n2所以可以得出n1<(N+2)/2两个口诀:二维矩阵:外维是行,内维是列。然后打表输入。接着去输出就可以了。其中一种需要去注意的地方是:输出第二个列的时候需要去注意:代码如下:#include <iostream>using namespace std;const int N=82;char res[N][N];int main(){ string str; cin>>.原创 2020-11-08 22:42:23 · 78 阅读 · 0 评论 -
pat-1092 To Buy or Not to Buy (20分)
散列函数的使用,其实哈希表也可以:题目简单去进行描述一下:就是现在去商店买东西,然后去匹配。如果我要的种类商店都有,但是数量不够,那么输出yes,且输出缺少的数量。如果我所需要的种类没有,那么输出no,然后输出缺少种类的数量。//注意一种情况:珠子的种类都有,但是数量不够#include <iostream>using namespace std;const int N=256;int cnt[N];int main(){ string a,b; cin>&.原创 2020-11-08 22:37:58 · 60 阅读 · 0 评论 -
pat-1104 Sum of Number Segments (20分)
题目很简单,估计都不看题目就可以了。就是从数字上面猜。注意两个点:一个是推导过程,(n+1-i)*i *v这是数字出现的值另外一点,最无语的,一直没找出来:数据被加强了。需要将类型定义为long double#include <iostream>using namespace std;int main(){ int n; long double a,ans=0; cin>>n; //每一个位置上面出现的次数(n+1-i)*i; f.原创 2020-11-05 17:20:59 · 53 阅读 · 0 评论 -
pat-1081 Rational Sum (20分)
题目意思:就是给你给你一堆数,模拟有理数的相加代码如下:#include <iostream>using namespace std;typedef long long LL;LL gcd(LL a,LL b){ return b?gcd(b,a%b):a;}int main(){ LL a=0,b=1; int n; cin>>n; for(int i=0;i<n;i++){ LL c,d; .原创 2020-11-05 16:47:47 · 46 阅读 · 0 评论 -
pat-1078 Hashing (25分)
主要考察:素数以及散列函数的使用:#include <iostream>#include <algorithm>using namespace std;const int N=11111;bool hashTable[N]={0};bool isprime(int n){ if(n<2) return false; for(int i=2;i<=n/i;i++){ if(n%i==0) return false; } return true;.原创 2020-11-04 22:49:32 · 58 阅读 · 0 评论 -
pat-Reversible Primes (20分)
简述:考察点:素数判断+进制制题目要求:就是给你输入数N,首先判断D是不是素数。如果是,然后N在D进制下进行翻转,然后返回成十进制,如果此时还是素数的话,那么就输出yes,否则输出no主要考察了素数判断和进制转换。素数判断其实pat中普通的方式就够了,当然可以去进行优化,打表和欧拉筛素数。进制转化是:使用辗转相除法,然后放到数组中就可以了。注意你在选择素数的时候千万要添加等号。就是因为这个原因,我一直在找问题。呜呜呜代码如下:#include <iostream>using na.原创 2020-11-04 22:46:39 · 79 阅读 · 0 评论 -
pat-1011 World Cup Betting (20分)
其实我没怎么读懂,但是我大概描述一下题目大意:题目大意:就是赌博下庄的问题:再一个三位矩阵中,在每一行找到最大的数,其实就是数字最大的庄。然后选取出来,最后还要去记录标号。如图:赌钱无非就是赢,输,平。没一行就是开一局赌局,然后选出数字最大的。比如这个图中:第一行选出来的数是2.5第二行选出来的数是3.1第三行选出来的数是4.1其实选出数字是最简单的,但是最后题目还要让你去记录编号就是比较麻烦的。几乎都是二维数组+字符进行模拟。但是我看到一个比较优质的解法,第一眼看到。我就直接卧槽了.原创 2020-10-27 08:57:09 · 80 阅读 · 0 评论 -
pat -1054 The Dominant Color (20分)
分析:题目大意(简约的来说就是统计数字的频率):就是给你一个二维的矩阵,找到里面出现超过一半次数的数字。其实就是哈希表的使用,你现在既定出一个二维图像,你现在里面去填充数字,然后将填充的数字放到哈希表里面,统计数组输出的次数。哈希表用来映射数字和次数之间的关系。注意:如果找到了数字,那么就要去return结束循环代码如下:#include <iostream>#include <map>using namespace std;int main(){ int n,.原创 2020-10-26 16:35:01 · 46 阅读 · 0 评论 -
pat-1008 Elevator (20分)
我会帮我做题过程中的一些小错误都会记录下来,如果有错误,也希望大家去改正。题目大概是描述:现在给你一个正整数n,然后来的n的数字代表楼层号,上一楼花费6秒,下一楼花费4秒,但是每一层都会停留一秒。计算出时间之和。其实就是开数组,然后计算出相邻直接的差值,模拟出楼层的关系。比如arr[i-1]-arr[i]表示的是两楼之间,如果>0那么表示上楼,否则表示的是下楼。最后的停楼时间去+5*n就可以了代码如下:#include <iostream>using namespace std.原创 2020-10-26 15:47:44 · 51 阅读 · 0 评论 -
pat-1048 Find Coins (25分)
复杂度都是比较低的,这题非常非常像leetcode的第一题,但是限定了,要找出字典的最小序,典型的双指针或者是哈希表。看了晴神的《算法笔记》,介绍了三种方法,但是题解仅仅实现了哈希散列,而且散列函数是自己写的。这里推荐直接使用一下哈希表。因为我只需要使用以下接口就可以了嘛二分查找:由于库函数提供了二分查找的模板,可以直接去使用。#include <iostream>#include <algorithm>#include <string.h>using na.原创 2020-10-22 22:27:42 · 64 阅读 · 0 评论 -
pat-1041 Be Unique (20分)
在一下午被力扣严重打击之后,写写pat。但是这题还是很操蛋的,我一直调试都是19分。最后一个的res在cout的时候才是有问题的。这里特别注意:一定要有printf();我用了那个叫ios::sync_with_stdio(false);结果还是那一个测试点有问题。题目大概意思:找到第一个只出现一次的数字。还是可以用哈希散列。1.输入的时候,记录每一个数字的位置,然后统计每一个字符的出现的次数。2.然后我们在第二次循环的时候,我对数字进行筛选,筛选出只出现一次的数字。这里我们不妨举一个例.原创 2020-10-22 18:03:06 · 108 阅读 · 0 评论 -
pat-1084 Broken Keyboard (20分)
写了一下午力扣,心被打得细碎,四个小时写了3道medium,实在是没有心情再去写了,算是边看题解边做题目,心情真的异常的差。可能是自己的基础太差了吧。刷刷pat的简单题恢复一下心情。分析:现在就是将坏键盘给打印出来,双指针+哈希散列:(1):一个个进行比对,如果发现相同,那么双指针都往下面走。然后发现不同,那么说明第二条指针短键,然后输出,并且标记,下次的时候就不用重复输出坏键盘#include <iostream>using namespace std;int main(){ s.原创 2020-10-22 17:34:47 · 57 阅读 · 0 评论 -
pat-1004 Counting Leaves (30分)
就是一个普通的常规题目,就是给你一棵树,求出树的每一层叶子节点的数量。注意输出,末尾没有空格,可以参考一下日沉云起大神的题解,他就是处理边界,输入输出上,写代码的风格非常棒,真的十分值得借鉴呀。可能底下的题解有别于《算法笔记》上面的题解,但是总体上还是相同的,使用邻接表去模拟树。关于这里邻接表的表示,可以参考我博客里面,链表那一章节的博客。希望看看呀,有问题的可以评论。#include <iostream>#include <algorithm>#include <.原创 2020-10-08 15:50:53 · 65 阅读 · 0 评论 -
pat-61-dating(20分)
pat-61-dating字符串模拟题,哈希表进行映射:题目大致意思:给你四个字符串,确定对应星期几,确定小时,分钟日期:在第一,第二个字符出中,找到相同索引下的第一个大写字母。A~G分别对应于 MON ~SUN.小时:在第一,第二个字符出中,找到相同索引下的第二个大写字母。[0~9 && A~N]对应于1 ~24分钟:在第三,第四个字符串中,相同的索引字母。其位置就是分钟数。注意小时和分钟需要保留两位小数。用printf比较好。哈希表进行星期的映射。最后写一个特别尬的事儿原创 2020-09-22 18:22:45 · 66 阅读 · 0 评论 -
pat-1065 A+B and C(64bit)(20分)
考察数字溢出的情况,其实还是比较容易的。但是需要一个先修知识,但是这里面还是有一个坑点,我稍微记录下来。我还以为这道题目我是秒过的。关于数字的溢出:正溢出:两个整数相加的结果超过了数据类型所能表示的最大范围,结果为负数负溢出:两个负数相加的结果超过了数据类型所能表示的最小范围,结果为正数(包括0)读入问题,对就是读入问题:用cin读入无法完全读入,如果用cin读入的话,读入好像存在了错误,我输入一个abc,结果输出了两个答案,可能这就是那一个测试点吧cin读入的判题结果:完整代码:#i.原创 2020-09-10 12:27:06 · 92 阅读 · 0 评论 -
pat-1059 Prime Factors (25分)
1059 Prime Factors (25分)//质因子分解,里面涉及到了前面的素数判断 #include <iostream>#include <math.h>using namespace std;const int maxn=100010;int prime[maxn],pNum=0;//pNum:记录的位置索引上的素数 //素数判断 bool isPrime(int n){ if(n<=1) return false; for(int i=2;原创 2020-08-08 19:21:07 · 105 阅读 · 0 评论 -
pat-1050 String Subtraction (20分)
大概的题意如下:给你两个字符串:分别是s1和s2,如果s2出现的字符在s1中也出现了。那么在s1字符串中挖掉s2出现的字符。作为闫总的徒弟,这一题还是有很多的地方可以说的。第一点(1):关于复杂度的问题,一秒钟C++大概可以计算10的八次次运算。但是这一题也是蛮奇怪的,给了你0.1秒,可是计算量已经超过10的八次方了。 接下来我会给出题解一。算是暴力做法(2):关于输入输出的问题,因为输入的时候出现了问题。如果仅仅是以流的形式进行输入,那么肯定出现错误,因为遇到空格就不在输入了。以后我会探讨关于输.原创 2020-06-18 23:28:55 · 112 阅读 · 0 评论 -
pat-1052 Linked List Sorting (64bit) (25分)
pat-1065 Linked List Sorting (64bit) (25分)参加晴神的《算法笔记》大概说几点我遇到的问题以及总结:1.pat链表内容的题目还是挺常规的,除非是工程应用或者leetcode的题目,它会使用指针实现数组。但是我做到现在,pat的题目都是:思量是链表,但是实现的是静态的方式。(xxx这里我会给一些链表的模板,还是很简单的。这里留一个空)2.关于代码的一个小细节,因为输入的问题,导入卡了一会//处理输入 for(int i=0;i<n;i++){原创 2020-09-15 13:28:03 · 64 阅读 · 0 评论