![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
PAT (Advanced Level) Practice
不会喷火的绿色小恐龙
这个作者很懒,什么都没留下…
展开
-
PTA L2-024 部落
题目复习一下并查集。首先将小部落内的人的father标记为部落序号,接着部落序号进行并查集的操作。#include <bits/stdc++.h>using namespace std;const int N=1e4+10;int n, tree[N], father[N];bool vis[N]={false};/*简单并查集int findFather(int x){ while(x!=father[x]){ x=father[x]; }原创 2022-04-20 21:11:51 · 351 阅读 · 0 评论 -
PTA L2-002 链表去重
题目注意一下,可能形成最原始的链表的结点数量不到n#include <bits/stdc++.h>using namespace std;const int N=1e6+1;int st, n, p1[N], p2[N], r1[N], r2[N];bool vis[N]={false};int main(){ scanf("%d%d", &st, &n); int a, b, c; for(int i=0; i<n; i++){原创 2022-04-20 15:33:09 · 945 阅读 · 0 评论 -
PAT (Advanced Level) Practice 1165 Block Reversing
题目没有用链表,感觉用指针写太麻烦了,想起当初刚学数据结构被链表支配的恐惧。坑点是可能的有不在链表的数据,链表的长度不一定为n.#include <bits/stdc++.h>using namespace std;const int N=1e6;int judge1[N], judge2[N], v[N];int main(){ int st, n, k, a, b, c; scanf("%d%d%d", &st, &n, &k);原创 2022-04-03 19:56:20 · 818 阅读 · 1 评论 -
PAT (Advanced Level) Practice 1135 Is It A Red-Black Tree
题目因为题目给的就是BST,所以直接按照BST的性质进行建树。需要满足红黑树的三个性质:一个是根结点为黑色,一个父结点为红色则子结点为黑色,一个相邻结点的路径中的黑色结点个数相同(个人认为,一个是比较兄弟结点,没有兄弟的就是最大值并记录,与其他无兄弟结点的叶子比较就行了)。以前不懂怎么写dfs的返回值不是void,这是第一次写,锻炼了。#include <bits/stdc++.h>using namespace std;const int N=33;int pre[N];int k原创 2022-04-03 18:27:22 · 742 阅读 · 0 评论 -
PAT (Advanced Level) Practice 1163 Dijkstra Sequence
题目通过本道题复习一下dijkstra算法,这也算是本菜鸡第一次不靠死记硬背的模板过题目了,也复习一下fill()函数对于初始化二维数组的用法。因为点的数量不多,所以选择了邻接矩阵的写法。#include <bits/stdc++.h>using namespace std;const int MAXV=1010;const int INF=0x3fffffff;int nv, ne;int edge[MAXV][MAXV], ver[MAXV], vis[MAXV], dis[M原创 2022-04-02 15:27:09 · 221 阅读 · 0 评论 -
PAT (Advanced Level) Practice 1167 Cartesian Tree
题目堆是一棵完全二叉树,树中每个结点的值都不小于(或不大于)其左右孩子结点的值。这是一道简单题。但是,本菜鸡对于堆的定义不了解。所以,卡住了。而且,这应该是本菜鸡第一次用指针的写法,完成的一道题目。#include <bits/stdc++.h>using namespace std;const int N=33;const int INF=0x3f3f3f3f;int num[N], res[N];struct node{ int data; node* l原创 2022-03-27 17:54:31 · 1080 阅读 · 0 评论 -
PAT (Advanced Level) Practice 1166 Summit (25 分)
题目因为只是判断是否是直接相连,所以觉得直接用暴力模拟,而且数据范围也很小。果然,许久不练题,A题的效率都下降了。不过,练题真的是打发时间的好途径。#include <bits/stdc++.h>#include <unordered_set>using namespace std;const int N=220;unordered_set<int> peo[N];int n, m;int main(){ scanf("%d%d", &原创 2022-03-27 14:35:33 · 389 阅读 · 0 评论 -
PAT (Advanced Level) Practice 1160 Forever (20 分)
PAT (Advanced Level) Practice 1160 Forever说来惭愧,许久不练题,思考一个问题很久——给定位数和总位数之和,求这样的数字有多少个。忘记了可以用dfs解决。因为这个问题纠结了许久。时间久了连gcd的板子写得都不熟练了这道题目,如果n=m+1n=m+1n=m+1的话,是不可能满足题意的,所以AAA的最后一位数字必然是9。其他位就不确定,所以暴力枚举。#include <bits/stdc++.h>using namespace std;#define原创 2022-03-07 19:48:26 · 109 阅读 · 0 评论 -
PAT (Advanced Level) Practice 1157 Anniversary
PAT (Advanced Level) Practice 1157 Anniversary这道题也不难,但是讲一个我自己需要注意的点:对于求最值的问题,不是总要通过排序来解决,可以在遍历的时候不断地进行比较(首先赋予最大值,或是最小值)。还有对于这道题目,让我疑惑的是,校友年龄最大的,是放在所有的校友范围,还是在仅出席的校友范围里比较得出的。不知道,不明了,不想要…复习在STL标准容器中,只有vector、string、deque是可以使用sort的。像set、map这种容器是用红黑树实现的,元素原创 2022-03-05 18:17:23 · 172 阅读 · 0 评论 -
PAT (Advanced Level) Practice 1156 Sexy Primes
PAT (Advanced Level) Practice 1156 Sexy Primes题目不难,本质上还是判断素数,直接暴力即可,但是受到某君影响,想通过线性筛解决本题。我本来不会线性筛,因为不懂原理,所以从来不用。但是对于这道题目,真心觉得没有必要,因为线性筛的范围无论是108还是题目输入数字n,都不好。前者直接爆掉,后者对于(n+6)的判断不友好(要么是重新调用线性筛,要么直接判断是否是素数)。所以采用直接判断n,(n-6),(n+6)是否是素数的暴力做法即可。不过通过这一题,我也再次学习线性筛原创 2022-03-05 15:38:18 · 198 阅读 · 0 评论 -
PAT (Advanced Level) Practice 1155 Heap Paths
题目从今天起,逆序开始重新刷一遍PTA甲级真题。重新写一遍这道题目,又探索出不一样,比以前简单一些的写法。当然简单体现在对于堆的判断。也就是对遍历得到的在一条链上的树的节点,进行排序,再与未排序的判断,进而确定堆是哪一种。其实就是利用大顶堆和小顶堆的性质。也不知道下一次能不能写出更简洁的算法。也希望这次重新刷甲级的过程,重新回顾以前学过的知识,掌握基础数据结构,甲级分数更高。#include <bits/stdc++.h>using namespace std;const int N=1原创 2021-11-13 16:25:20 · 1179 阅读 · 0 评论 -
PTA 1146
题目这道题目考察拓扑排序的原理,最近准备甲级考试,忽然发现缺了拓扑排序这一块内容,昨天晚上补了一下,做这道题目的时候还是想着板子,今天大致看了一下别人的思路,自己敲出来了。其实就是对于每次询问,判断每个点的入度是否为0,如果为0,将该点指向的下一结点的入度减1。边遍历边进行这样的操作,判断n个点是否全部点的入度为0。希望明天甲级考试顺利愉快!!!#include <bits/stdc++.h>using namespace std;const int N=1100;vector<原创 2021-09-10 09:32:15 · 52 阅读 · 0 评论 -
2021-09-08
题目首先,判断是否形成一棵树。因为一共只有n-1条边,如果没有形成树,那一定形成了一个非连通图,并查集所得到的集合个数必然超过1,所以可以用并查集进行判断。其次,思维过程就是求树的直径,两次dfs(说实话,本菜鸡还是不懂求树的直径的原理,似懂非懂的样子,考完甲级后,认真研究一下)。#include <bits/stdc++.h>using namespace std;const int N=1e5+10;int n, father[N];vector<int> G[N]原创 2021-09-08 14:48:28 · 45 阅读 · 0 评论 -
PTA 1013
因为需要考PAT甲级,所以最近一直在重新刷以前不知道怎么就刷过(主要是当时实在是什么都不懂,学习了什么知识,都是一知半解的)的题目,觉得收获很大。看了《算法笔记》,这道题目,转化过来,其实就是求图中连通块的个数问题。这里两种做法,一种是dfs执行的次数,一种是并查集中集合个数。也明白了连通块的含义(离散数学没学好,就是一直刷题,理论上不知道叫这个名字)dfs版:#include <bits/stdc++.h>using namespace std;const int N=1e3+10原创 2021-09-08 12:58:57 · 64 阅读 · 0 评论 -
PAT 1103
昨天晚上一直写,但是写不出来,今天再重新看了《算法笔记》上的代码,突然有了新的感受。首先根据已知的n和p,得到因子可能出现的范围(包括0),因为vector的因子是升序的,根据题目的要求,从最大值开始进行选择,但是注意一个数字可以出现多次,也可以一次都不出现。这决定了dfs如何转移状态.递归的终止条件很好判断。这也是很暴力的深搜。#include <bits/stdc++.h>using namespace std;vector<int> num, temp, ans;int原创 2021-09-08 09:35:52 · 46 阅读 · 0 评论 -
PAT 1143
BST(二叉搜索树)与其先序遍历(preorder traversal sequence ),即先序遍历中每个点都可以看做是所在子树的根结点。而本题需要求出两个点的lca问题。根据BST的性质与先序遍历,可直接进行暴力,得到结果。顺便在这里回顾一下以前的知识,BST的中序遍历就是BST中各结点从小到大排列好的结果。#include <bits/stdc++.h>using namespace std;const int N=1e5+10;int pre[N];map<int,原创 2021-09-07 10:48:28 · 120 阅读 · 0 评论 -
PAT 1149
题目题目不难,但是应该是看到的这个思路,感觉挺不错的,记录一下这个思路,有一种入栈出栈的感觉(个人感觉)#include <bits/stdc++.h>using namespace std;const int N=1e5+10;vector<int> v[N];int main(){ int n, m, a, b; scanf("%d%d", &n, &m); for(int i=0; i<n; i++){原创 2021-09-06 19:42:31 · 48 阅读 · 0 评论 -
2021-09-06
题目好久没练题了,一直忙许多乱七八糟的事情。最近要考甲级,所以重新刷甲级真题。这道题目不难,就是简单的查找与排序(说来说去,还是字符串的处理)。但是有个以前不知道,现在知道的点,关于C++中的endl与"\n"之间的区别。在没有必要刷新输出流的时候应尽量使用cout<<"\n",过多的endl是影响程序执行效率底下的原因。endl除了写’\n’进外,还调用flush函数,刷新缓冲区,把缓冲区里的数据写入文件或屏幕,考虑效率就用’\n’因为大量使用endl,导致后面两个测试点一直运行超原创 2021-09-06 15:19:08 · 60 阅读 · 0 评论 -
PAT (Advanced Level) Practice 1133 Splitting A Linked List
本题实际上考察数据结构中最基本的数据结构——链表但是本题代码并没有采用链表这一数据结构, 而是借用C++STL的容器vector进行记录数据以前在学习数据结构时,课上也有这道题,但是一直不会,只能参考网上运用链表的题解代码。说实话,之前刷乙级的时候,也只是随便应付了这样的链表题,依旧不会;最近刷甲级,也是把这样的题目放在最后,认真思考了一会儿,依旧不敢用链表写(还是对指针的知识掌握地不扎实),但是过这道题不一定用链表,所以投机取巧了一下注意一下,这里当temp==-1时,就说明到了链表的末尾,而不是遍原创 2021-04-13 19:26:02 · 68 阅读 · 0 评论 -
PAT (Advanced Level) Practice 1147 Heaps
本题仅仅用到堆的性质(大顶堆和小顶堆)并不涉及对堆的代码考察,实际上考察的还是完全二叉树的性质,以及通过层序遍历得到后序遍历之前也认真写过一次,但是没有写出来;这次又试了试,过了对于遍历,还是先记录过程中的数据;最后在main()函数里输出结果#include <cstdio>#include <vector>using namespace std;const int maxn=1e3+10;int n, layer[maxn];vector<int> v原创 2021-04-12 20:50:51 · 58 阅读 · 0 评论 -
PAT (Advanced Level) Practice 1154 Vertex Coloring
本题考查C++的STL中的容器set的作用首先,本人的读题能力实在太差了(不论中文,还是英文),导致总是理解错题意,这道题也不意外;但是这道题的题意不复杂,就是**“no two vertices sharing the same edge have the same color”,意为边的两个端点颜色必须不同**。其次,对于思路,我首先想到的是邻接矩阵用来表示两个相互连接的点(此时点的范围最好在1e3以内);但是,题目给出n的范围是小于1e4,所以必须换一个。如果是邻接表,用来判断两个点之间是否存在边原创 2021-04-12 16:44:32 · 68 阅读 · 0 评论 -
PAT (Advanced Level) Practice 1123 Is It a Complete AVL Tree
本题考查了AVL树的建立,插入,左旋,右旋等一系列基本操作,还有二叉树的层序遍历,完全二叉树的性质这些知识点其实就是在PAT (Advanced Level) Practice 1066 Root of AVL Tree的基础上增加层序遍历以及完全二叉树的判断题目 PAT (Advanced Level) Practice 1066 Root of AVL Tree题目 PAT (Advanced Level) Practice 1123 Is It a Complete AVL Tree再来复习一原创 2021-04-05 12:36:35 · 50 阅读 · 0 评论 -
PAT (Advanced Level) Practice 1073 Scientific Notation
在我看来,本题考察STL中string的插入,删除等一系列操作函数科学计算法转换为数字时,注意要分类讨论(数字的正负,是否在数字的前面,还是后面增加多少的零)指数的正负决定了小数点的移动方向,指数的大小决定了小数点移动的位数说实话,之前看到这道题时,我尝试编写代码时并不成功,思维也比较混乱。今天在刷题的时候,重新整理思路,分类讨论,慢慢也就写出来了。写代码大概就是这样的过程吧!题目#include <iostream>#include <cstring>#include原创 2021-04-04 20:36:40 · 58 阅读 · 0 评论 -
PAT (Advanced Level) Practice 1105 Spiral Matrix
本题就是将所给的一系列数进行排序,然后数字以从大到小的方式,以顺时针圆圈(我也不知道这样说法能不能让别人理解,具体可参照题目和给出的样例)的形式输出由于printf()函数只能一行一行的输出,所以造就了本题的难度。说实在话,之前刷乙级的时候,我也没写出这道题。前天刚写完甲级的一道题1082 Read Number in Chinese,看了《算法笔记上机训练实战指南》的题解,再看到这道题时,就有了一点想法。题目#include <cstdio>#include <cmath>原创 2021-04-04 12:43:35 · 79 阅读 · 0 评论 -
PAT (Advanced Level) Practice Complete Binary Tree
本题运用到了树的静态写法来创建树,二叉树的层序遍历来检验该二叉树是否为完全二叉树题目在层序遍历中,如果遇到结点为空的情况(在代码中表示为-1)的情况,则说明该树不是一棵完全二叉树,,则输出 No和根节点;如果遍历了全部的结点(均不为空),则输出Yes和最后一个结点这是我之前刷 PTA(Advanced Level) 其他有关树的题目,从《算法笔记上机训练实战指南》中学习到如何获取根节点的方法,在这里提一下获得二叉树的根节点编号,即0~(N-1)中未在输入中出现过的那个数。代码如下#inclu原创 2021-03-31 20:33:17 · 73 阅读 · 0 评论 -
PAT (Advanced Level) Practice 1086 Tree Traversals Again
利用本题复习根据二叉树的前序遍历和中序遍历来建立二叉树, 并且得到二叉树的后序遍历题目本题还应用到了栈,对于栈这种后进先出数据结构,我们需要注意根据数字的进栈顺序,我们可得到二叉树的先序遍历;根据数字的出栈顺序,可得到二叉树的中序遍历;通过先序遍历和中序遍历,我们可建立一棵确定的二叉树, 最后可得到后序遍历#include <bits/stdc++.h>using namespace std;int n;const int maxn=33;int pre[maxn], in[max原创 2021-03-30 11:51:50 · 77 阅读 · 0 评论 -
PAT (Advanced Level) Practice 1115 Counting Nodes in a BST
本题主要考查考查BST的创建(插入)。题目层数可直接在结构体node里添加变量进行表示, 通过设定层数为下标的数组来记录层数的结点个数,这两个变量可在插入时同时记录, 同时可得到最大层数;当然,个人以为自己的代码, 不如《算法笔记上机训练实战指南》给出的示例代码好, 尤其用 BFS的算法实现部分, 值得学习。除此之外,个人对 BST的代码实现能力还是不够扎实#include <cstdio>const int maxn=2020;int n, f=0, a[maxn], hash[m原创 2021-03-26 15:27:10 · 49 阅读 · 0 评论 -
PAT (Advanced Level) Practice 1043 Is It a Binary Search Tree
利用本题, 复习二叉搜索树的创建(插入),后序遍历,以及掌握BST的特性题目#include <cstdio>#include <cstring>const int maxn=1e3+1;int n, a[maxn], b[maxn], c[maxn];int cnt=0;struct node{ int data; node* lchild; node* rchild;}; node* newnode(int x){ node* temp=new no原创 2021-03-22 23:27:16 · 92 阅读 · 0 评论 -
PAT (Advanced Level) Practice 1094 The Largest Generation
欢迎使用Markdown编辑器你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。新的改变我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客:全新的界面设计 ,将会带来全新的写作体验;在创作中心设置你喜爱的代码高亮样式,Markdown 将代码片显示选择的高亮样式 进行展示;增加了 图片原创 2021-03-20 09:00:31 · 65 阅读 · 0 评论