
PAT甲级
文章平均质量分 50
郭同学如是说
在这里亟需一个宏大的的沉思。
展开
-
【PAT甲级】1020 Tree Traversals (25 分)【bfs,递归,树的遍历】
树的三种遍历方式先序遍历(preorder):根、左、右中序遍历(inorder):左、根、右后序遍历(postorder):左、右、根层序遍历:按层遍历原创 2021-05-29 00:28:10 · 105 阅读 · 0 评论 -
【PAT甲级】1004 Counting Leaves (30 分)【dfs、树】
【PAT甲级】1004 Counting Leaves (30 分)【dfs、树】思路邻接表存储树的信息用邻接表来存储树。具体可以使用vector数组实现,若id是一个节点的值,那么v[id]保存id节点的所有子节点,如下图:第0层,该树的根节点1有两个子节点2,3,因此v[1]就有两个元素,分别是2,3,且根节点所在层的叶子节点数是0第1层,2节点有两个子节点,分别是4,5,因此v[2]有两个元素,分别是4,5;由于3节点没有子节点,所以第1层的叶子结点数量是1,以此类推w原创 2021-05-27 19:25:01 · 256 阅读 · 1 评论 -
【PAT甲级】1057 Stack (30 分)【栈】
【PAT甲级】1057 Stack (30 分)【栈】思路对于pop和push操作,用stack就可以实现对于PeekMedian操作,可以用vector维护栈中所有元素,并且保证递增排序,这样的话vector的中间元素就是中位数当push和pop的时候,vector需要对应的做insert和erase操作,这需要用到lower_boundlower_bound( begin,end,num):从begin位置到end-1位置二分查找第一个大于或等于num的数字,返回该数字的迭代器代码原创 2021-05-25 20:26:12 · 185 阅读 · 0 评论 -
【PAT甲级】1125 Chain the Ropes (25 分)【贪心】
【PAT甲级】1125 Chain the Ropes (25 分)【贪心】思路每次合并两个绳子,设长度分别为a,b,合并之后变为(a+b)/2(a+b)/2(a+b)/2每次取最小的两个绳子合并即可,此时最终得到的结果是最大的,分析方法与哈夫曼树类似向下取整用强制类型转换(int)即可代码#include <iostream>#include <algorithm>const int N=1e5+10;using namespace std;doubl原创 2021-05-25 19:54:58 · 103 阅读 · 0 评论 -
【PAT甲级】1113 Integer Set Partition (25 分)【贪心】
【PAT甲级】1113 Integer Set Partition (25 分)【贪心】思路题目给出一组输入,让你划分为两个集合s1、s2,他们的元素个数分别为n1,n2,让你找到满足∣n1−n2∣|n1−n2|∣n1−n2∣ 尽可能小,并在此基础上 ∣S1−S2∣|S1−S2|∣S1−S2∣ 尽可能大的结果将数组排序,s1为前[n/2]个元素的和(下取整),s2是后面所有数的和,此时答案满足题意要求代码#include <iostream>#include <alg原创 2021-05-25 19:32:58 · 113 阅读 · 0 评论 -
【PAT甲级】1070 Mooncake (25 分)【贪心】
【PAT甲级】1070 Mooncake (25 分)【贪心】思路题目给出每种月饼的总重量和总价值,由此可以得到月饼的单价,这些信息用结构体存储对数组按照单价从高到低进行排序月饼总需求量sum是固定的,因此优先采购单价高的(遍历操作即可)代码#include <iostream>#include <algorithm>#include <cstring>using namespace std;struct mooncake{ do原创 2021-05-25 19:05:03 · 125 阅读 · 0 评论 -
【PAT甲级】1037 Magic Coupon (25 分)【贪心】
【PAT甲级】1037 Magic Coupon (25 分)【贪心】思路题目很长,但是其实本质很简单,就是说给你两个数组,取两个数组的数进行乘法运算,看如何组合能得到最大值对两个数组分别从小到大排序,i指向a数组最小值,j指向b数组最小值,如果都是负数那么他们的乘积是整数而且是最大的;之后让i指向a数组最大值,j指向b数组最大值,如果都是正数那么他们乘积是最大的。之后指针移位,继续让指向的下一组做乘法运算(如果满足同时正/同时负的话)代码#include <iostream>原创 2021-05-25 00:48:59 · 121 阅读 · 0 评论 -
【PAT甲级】1137 Final Grading (25 分)【哈希表】
【PAT甲级】1137 Final Grading (25 分)【哈希表】思路建立student类型的结构体,内含学生id、三个成绩、总成绩sum在结构体的内部进行初始化,将各个成绩置为-1在结构体的内部写calc函数,计算总成绩在结构体的内部重载运算符,方便后面排序操作(题目要求了输出顺序为按照总评分数(四舍五入精确到整数)递减。若有并列,则按学号递增。)构建unordered_map,形成string类型到student类型的映射四舍五入操作用round函数将符合要求的student原创 2021-05-24 23:01:13 · 101 阅读 · 0 评论 -
【PAT甲级】1078 Hashing (25 分)【哈希表】
【PAT甲级】1078 Hashing (25 分)【哈希表】https://pintia.cn/problem-sets/994805342720868352/problems/994805389634158592)思路哈希表的长度需要是一个素数st数组标记该位置是否被用到过,如果用到过(发生哈希冲突),使用只具有正增量的二次探测法来解决冲突如果探测s次(s是哈希表的长度)仍然发生冲突,则认为不可能插入find函数返回某个数字应该在哈希表中的位置,如果找不到,返回-1代码#inclu原创 2021-05-24 22:47:08 · 148 阅读 · 0 评论 -
【PAT甲级】1149 Dangerous Goods Packaging (25 分)【哈希表】
【PAT甲级】1149 Dangerous Goods Packaging (25 分)【哈希表】思路开两个数组a[N]和b[N],a[i]和b[i]构成不可以同时放入的危险物品对对于每个查询,把所有的物品装入一个unordered_set中,遍历a和b数组,看a[i]和b[i]是否同时在set中出现,如果同时出现,那么说明不可以同时放入,否则可以代码#include <iostream>#include <unordered_set>using namesp原创 2021-05-24 22:41:00 · 136 阅读 · 0 评论 -
【PAT甲级】1144 The Missing Number (20 分)【哈希表】
【PAT甲级】1144 The Missing Number (20 分)【哈希表】思路把所有数字存到unordered_set中,然后从1开始枚举,如果不在set就说明是答案,输出即可代码#include <iostream>#include <unordered_set>using namespace std;int main(){ int n;cin>>n; unordered_set<int> s; f原创 2021-05-24 22:26:48 · 89 阅读 · 0 评论 -
【PAT甲级】1120 Friend Numbers (20 分)【哈希表】
【PAT甲级】1120 Friend Numbers (20 分)【哈希表】思路得到每一个数字的各位数字之和,存储到set中set的大小就是最终的Friend Numbers的个数遍历输出set中的值,即为答案序列要注意到,不可以使用unordered_set,因为set是已经排好序的,而unordered_set是未排好序的,因此直接输出set序列可以得到从小到大的结果,而unordered_set不可以set和unordered_set的异同:set基于红黑树实现,红黑树具有自动排原创 2021-05-24 22:19:41 · 87 阅读 · 0 评论 -
【PAT甲级】1063 Set Similarity (25 分)【哈希表】
【PAT甲级】1063 Set Similarity (25 分)【哈希表】思路集合的相似度是说,两个集合中都存在的不同整数的数量除以两个集合中不同整数的数量使用set数组来存储集合中的元素,对应的声明:unordered_set<int> s[N];对于a,b两个集合,为了得出相同的元素数量,只需要遍历第一个集合,查看是否在b集合中出现即可,如果出现,则相同元素+1,用变量cnt保存该结果不同的元素的数量为s[a].size()+s[b].size()-cnt注意到最后要保存一原创 2021-05-24 21:39:46 · 112 阅读 · 0 评论 -
【PAT甲级】1145 Hashing - Average Search Time (25 分)【哈希表】
【PAT甲级】1145 Hashing - Average Search Time (25 分)【哈希表】思路哈希表的长度必须是一个素数,因此通过语句while(!isprime(s)) s++;使得s为最小的满足要求的素数使用正增量的二次探测法来解决冲突,也就是说试探t,t+11,t+22…以此类推,直到找到无哈希冲突的地址如果试探了s次仍然没有找到对应地址,那么就把查找次数置为s+1可以写一个find函数,返回值为一个值在哈希表中的位置,如果查不到,则返回-1最终结果保留一位小数代原创 2021-05-24 21:16:36 · 158 阅读 · 0 评论 -
【PAT甲级】1048 Find Coins (25 分)【哈希表】
【PAT甲级】1048 Find Coins (25 分)【哈希表】思路使用unordered_map存储硬币值,形成哈希映射对于输入的x,如果m-x在哈希表中存在,那么存在一对硬币x+(m-x)=m为了保存最小的硬币,可以用a,b维护一对最小的硬币对,初始化为很大的数字,如果找到一对更小的硬币面值组合,就更新a,b值代码#include <iostream>#include <unordered_set>using namespace std;int ma原创 2021-05-24 21:07:57 · 92 阅读 · 0 评论 -
【PAT甲级】1107 Social Clusters (30 分)【并查集】
【PAT甲级】1107 Social Clusters (30 分)【并查集】思路如果两个人拥有相同的爱好,那么他们就在一个网络里。比如a,b有相同爱好1,b,c有相同爱好2,那么a,b,c在相同网络里先把输入存下来,可以开一个大小为N的vector数组,保存第1-1000个爱好的人如图,对于编号1-1000的爱好,每个爱好都有一个vector用来存储对应的人遍历每个爱好,将同一个爱好中的人进行并查集的合并操作从1-n遍历每个人,find(i)表示i节点的祖宗节点c原创 2021-05-14 22:30:31 · 127 阅读 · 0 评论 -
【PAT甲级】1118 Birds in Forest (25 分)【并查集】
1118 Birds in Forest (25 分)思路输入输出:第一行为照片数量nnn,接下来nnn行,每行第一个数字是 kkk,后面是 kkk 个数字,表示该照片中的鸟的编号鸟的个数最多是10410^4104,nnn的个数最多是10410^4104,kkk的个数最多是10qqq个查询,qqq最大可达10410^4104输出的第一行是最大可能的树的数量与鸟的数量,接下来n行每行输出Yes/No表示给定的两个数是否在同一个树上具体实现:首先需要一定的并查集的知识,具体实现可见htt原创 2021-05-13 21:10:49 · 120 阅读 · 0 评论 -
【PAT甲级】1013 Battle Over Cities (25 分)【并查集】
【PAT甲级】1013 Battle Over Cities (25 分)题目要求在战争中,所有城市都必须通过高速公路连接起来,这一点至关重要。如果一个城市被敌人占领,则从该城市/往该城市的所有高速公路都将关闭。此时,我们必须立即判断是否需要维修其他高速公路以保持其余城市的连通性。给定城市与道路分布地图以及一个重点关注城市列表,请你判断,当列表中的某个城市被攻陷时,至少要维修多少条高速公路才能保持其余城市的连通性。例如,共有 3 座城市,由 2 条高速公路将它们连通,一条连接城市 1 和城市原创 2021-05-12 11:56:44 · 203 阅读 · 0 评论 -
【PAT甲级】1085 Perfect Sequence (25 分)【双指针算法】
题目要求给定一个正整数序列和一个正整数 p。如果 M≤m×pM≤m×pM≤m×p 成立,则该序列被称为完美序列,其中 M 和 m 分别是序列中的最大和最小数。现在给定一个序列和一个参数 p,你应该从序列中找到尽可能多的数字以构成一个完美的子序列。思路先对数组进行排序该题符合双指针算法,因为当找到一个完美序列的时候,若i指向最大值,j指向最小值,那么此时下一个完美序列的 i’ 一定在i的右侧,j’ 一定在j的右侧(可以由M≤m×pM≤m×pM≤m×p 推出)暴力做法复杂度O(n2)O(n..原创 2021-05-05 21:28:05 · 249 阅读 · 0 评论 -
【PAT甲级】1051 Pop Sequence (25 分)【栈、模拟】
【PAT甲级】1051 Pop Sequence (25 分)题目要求给定一个最多能存 M 个数字的栈,将 1∼N 按顺序压入栈中,过程中可随机弹出栈顶元素。当 N 个数字都经历过入栈和出栈后,我们按照元素出栈的顺序,可以得到一个弹出序列。现在给定一系列 1∼N 的随机排列序列,请你判断哪些序列可能是该栈的弹出序列。例如,当 N=7,M=5 时,1, 2, 3, 4, 5, 6, 7可能是该栈的弹出序列,而 3, 2, 1, 7, 5, 6, 4 不可能是该栈的弹出序列。思路将1~n依次原创 2021-05-05 21:01:40 · 313 阅读 · 0 评论 -
【PAT甲级】1040 Longest Symmetric String (25 分)【双指针】
【PAT甲级】1040 Longest Symmetric String (25 分)题目要求给定一个字符串,求出该字符串的最大回文子串思路由于数据范围是1000,因此可以使用O(n2)O(n^2)O(n2)的做法而不会超时遍历字符串,str[i]表示遍历到的字符第一种回文串可能性:此时str[i]=‘d’可以看到,str[i-1]str[i+1]相等,构成回文第二种回文可能:可以看到,str[i]和str[i+1]相等,构成回文因此,使用二重循环,得出上面两种可能的最大值即可原创 2021-05-05 19:52:14 · 109 阅读 · 0 评论 -
【PAT甲级】1046 Shortest Distance (20 分)【前缀和】
【PAT甲级】1046 Shortest Distance (20 分)题目要求一个环形高速公路上有 N 个出口,共有 M 次询问,每次询问你需要回答其中两个出口之间的最短距离是多少。输入格式第一行首先包含一个整数 N,接下来包含 N 个整数 D1,D2,…,DN,其中 Di 是第 i 个出口与第 i+1 个出口之间的距离,DN 是第 N 个出口与第 1 个出口之间的距离。第二行包含一个整数 M,表示询问次数。接下来 M 行,每行包含两个整数,表示询问两个出口之间的最短距离。输出格式共原创 2021-05-04 22:39:27 · 269 阅读 · 0 评论 -
【PAT甲级】1029 Median (25 分)【双指针、二路归并】
【PAT甲级】1029 Median (25 分))题目要求给定一个 N 个整数构成的递增序列,中位数是中间位置的数字。如果一共有奇数个数,则中位数是最中间的数;如果一共有偶数个数,则中位数是中间偏左的数。例如 S1={11,12,13,14} 的中位数是 12,S2={9,10,15,16,17} 的中位数是 15。两个序列的中位数定义为包含两个序列的所有元素的非递减序列的中位数。例如,S1 和 S2 的中位数为 13。给定两个递增序列,请你找出它们的中位数。思路思路一:排序后,中位原创 2021-05-04 22:27:36 · 187 阅读 · 0 评论 -
【PAT甲级】1133 Splitting A Linked List (25 分)【链表】
1133 Splitting A Linked List题意说明给定一个单链表,请编写程序将链表元素进行分类排列,使得所有负值元素都排在非负值元素的前面,而 [0,K][0,K][0,K]区间内的元素都排在大于 K 的元素前面。但每一类内部元素的顺序是不能改变的。例如:给定链表为 18→7→-4→0→5→-6→10→11→-2,K 为 10,则输出应该为 -4→-6→-2→7→0→5→10→18→11。思路首先,用数组模拟链表,可以参考这篇博文https://blog.youkuaiyun.com/原创 2021-05-04 21:40:47 · 138 阅读 · 0 评论 -
【PAT甲级】1097 Deduplication on a Linked List (25 分)【链表】
【PAT甲级】1097 Deduplication on a Linked List (25 分)题意说明给定一个链表,删掉其中拥有重复键值绝对值的节点,最终需要分别输出两个链表思路使用数组模拟邻接表,存储链表的信息遍历链表,如果该节点的值的绝对值未出现过,则将该节点的地址加入到第一个vector数组a中,如果出现过,则加入到第二个vector数组中分别遍历两个vector,进行输出,要注意进行特判链表结尾的-1代码#include <iostream>#includ原创 2021-05-04 18:30:35 · 103 阅读 · 1 评论 -
【PAT甲级】1074 Reversing Linked List (25 分)【链表、vector】
【PAT甲级】1074 Reversing Linked List (25 分)题意说明给定一个常数 K 和一个单链表 L,请你在单链表上每 K 个元素做一次反转,并输出反转完成后的链表。如果链表最后一部分不足 K 个元素,则最后一部分不翻转。例如,假设 L 为 1→2→3→4→5→6,如果 K=3,则你应该输出 3→2→1→6→5→4;如果 K=4,则你应该输出 4→3→2→1→5→6。思路使用数组模拟邻接表,存储链表的信息遍历数组,将所有节点进行翻转后的的地址的值存到vector里面原创 2021-05-04 17:45:10 · 156 阅读 · 0 评论 -
【PAT甲级】1032 Sharing (25 分)【链表、哈希表】
原题链接https://pintia.cn/problem-sets/994805342720868352/problems/994805460652113920题目要求用链表的节点存储单词的字母,从而达到复用的目的给定两个链表中每个节点的地址、值和指向的下一个节点的地址,让你求出他们公共的节点所在的地址值,如果没有公共的节点,那么输出-1如图,loading和being共同的第一个字母是i,因此输出i的地址输入与输出输入:第一行给出第一个链表的头节点的地址、第二个链表的头结点的地址,以及原创 2021-05-04 14:59:37 · 105 阅读 · 0 评论 -
PAT甲级题目分类【持续更新】
准备开一个PAT甲级的题解专栏,将题目按照分类罗列在此,方便找到对应的题目,有针对性行的进行刷题原创 2021-05-02 23:06:28 · 409 阅读 · 0 评论