
PAT
PAT 题目
爱幻想-hjyp
遇到坎就得迈过去
展开
-
PAT 甲级 1130 Infix Expression (25 point(s)) 二叉树中序遍历
题目题目链接思路思路:根据树表达式写出正确的表达式,除了根节点和叶结点外,其他结点在遍历左子树时都必须先输出左括号,然后当遍历完右子树后输出右括号代码# include<iostream># include<set># include<string>using namespace std;const int maxn = 30;struct node { int left, right; string s;}tree[max原创 2021-03-18 17:57:07 · 159 阅读 · 0 评论 -
PAT 甲级 1129 Recommendation System (25 point(s)) set自动排序
题目题目链接思路题目大意:给一个人的选座记录,根据用户以往选择座位的次数来为推荐k个座位,按照选择的次数从大往小推荐,如果次数一样则按id从小到大排序做法:定义一个结构体,利用set自动排序的特性,每次取前几个元素。更新元素时,需要删除之后再插入代码# include<iostream># include<set>using namespace std;const int maxn = 50010;struct item { int id, cnt原创 2021-03-18 16:27:15 · 130 阅读 · 0 评论 -
1128 N Queens Puzzle (20point(s))标识主对角线和副对角线
题目题目链接思路标识矩阵的每一条主对角线(y - x + n)和副对角线(y + x),具体跟八皇后问题一样;代码#include <iostream>#include <cstring>using namespace std;const int N = 1010;bool row[N], dg[N * 2], udg[N * 2];int main(){ int m, n, a[N]; scanf("%d", &m);原创 2021-01-28 15:44:41 · 231 阅读 · 0 评论 -
1126 Eulerian Path (25point(s)) 欧拉图的判定+连通图的判定dfs
题目题目链接思路欧拉图:对于一个连通图,如果从一个顶点出发,把图中每条边仅走一次,最后回到出发点即为欧拉图(著名的七桥问题);欧拉图性质:每个顶点的度都是偶数;先把图用邻接表存起来,然后用dfs判断是否是连通图(一定要判断是否是连通图,否则有一个测试点过不去);dfs的过程中,统计度为奇数顶点的个数,然后根据题意输出就可以了;代码#include <iostream>#include <vector>#include <cstring>using原创 2021-01-28 14:47:06 · 421 阅读 · 0 评论 -
1125 Chain the Ropes (25point(s)) 贪心
题目题目链接思路给很多段绳子,你要做的是将这些绳子串成一条绳子: 每次从绳子中取两段,每段绳子对折后套在一起,所以绳子的长度会减半,求最终能串成的绳子最大长度;为了使最终绳子的长度最大,我们要尽可能使较长的绳子尽量少对折;从小到大排序后,依次串联起来即可;代码#include <iostream>#include <vector>#include <string>#include <algorithm>#include <stack原创 2021-01-23 16:03:55 · 127 阅读 · 1 评论 -
1124 Raffle for Weibo Followers (20point(s)) 模拟
题目链接题目链接思路理解题意:每隔n个人选一个获奖者,但是要求这n个人里面不能有已经获奖的人;思路:用一个set保存已经获奖的人,s代表下一个获奖人的次序,依次读入每一个人名,如果这个人名出现过,那么s++,表明跳过当前读入的这个已获奖人,如果i==s,说明当前读入的这个人应该获奖,所以将这个人输出,并s+=n重新找下一个获奖的人;代码#include <iostream>#include <vector>#include <string>#includ原创 2021-01-23 15:43:20 · 124 阅读 · 0 评论 -
1121 Damn Single (25point(s)) map,set的使用
题目题目链接思路用map把每个组合存入,这里谁是关键字不重要;用set把要判断的人存入,,set有自动排序的功能;遍历map中的每一个元素,当且仅当map中一个组合中的key和value都可以在set中找到时,才将这个组合从set中删去;代码#include <iostream>#include <vector>#include <cstring>#include <algorithm>#include <stack>#in原创 2021-01-12 16:26:44 · 134 阅读 · 0 评论 -
PAT(甲级) 1120 Friend Numbers (20point(s)) set的使用
题目题目链接思路依次处理每个数字,把每位数字求和后放入set容器中(set容器会自动排序)代码#include <iostream>#include <vector>#include <cstring>#include <algorithm>#include <stack>#include <set>#include <queue>#include <malloc.h>#include原创 2021-01-08 17:58:52 · 93 阅读 · 0 评论 -
1115 Counting Nodes in a BST (30point(s))
题目题目链接思路1、构建一棵二叉搜索树,注意左子树是小于等于;2、层次遍历每一层的节点个数;3、输出最后两层结点个数;感觉没什么问题啊,为什么只能部分通过,明天再说吧!!!代码#include <iostream>#include <vector>#include <cstring>#include <algorithm>#include <stack>#include <set>#include <q原创 2021-01-08 17:35:26 · 145 阅读 · 0 评论 -
PAT 甲级 1113 Integer Set Partition (25point(s)) 双指针
题目题目链接思路题目大意:给一堆数,将这堆数分成两份,要保证两份数的个数至多差一个,且各自和的差值最大;将这堆数从小到大排序,一个指针i指向首元素,一个指针j指向尾元素,将i所指元素放入第一堆,j所指元素放入第二堆;然后i ++, j–;这样最后当二者相遇时,说明有一个元素多余,那么把这个多余的放入值较大的堆,保证差值最大;代码#include <iostream>#include <algorithm>#include <memory>#include原创 2020-07-16 16:01:46 · 134 阅读 · 0 评论 -
PAT(甲级)1110 Complete Binary Tree (25point(s)) 判断是不是完全二叉树
题目题目链接思路题目大意:给一颗二叉树,判断是不是完全二叉树;可以根据完全二叉树的性质来判断,在线性存储结构下,左孩子下标 = 2 * 父节点, 右孩子下标 = 2 * 父节点下标+ 1;我们在输入节点过程中,如果一个节点是别人的孩子节点,那么他一定是根节点,这样在输入完成后,在遍历一遍所有节点,就可以找到根节点;然后从这个根节点出发开始DFS,输入两个参数,一个是这个节点的id,另一个是这个节点如果在线性表中应有的下标,如果下标大于全局最大值,那么更新最大值,并且记录这个节点的id,作为最后一原创 2020-07-03 16:28:25 · 140 阅读 · 0 评论 -
PAT(甲级)1111 Online Map (30point(s)) 最短路算法
题目题目链接思路题目大意:给一张图,注意有的边是有向的,有的是无向的;分别找出从起点到终点最短路径和最快路径;如果两个路径相同,只输出一次;首先来看题的要求,需要输出路径,那么需要用一个pre数组存储最终路径上每一个节点的前驱;由于要求最短路和最快路,所以需要两次Dijktras算法:在求最短路的过程中,由于可能会出现最短路相同的情况,所以需要维护一个花费时间最短的t数组(注意:这个最短时间并不是全局最短时间,只是在满足最短路的前提下的最短时间,一会计算最短时间时需要重新赋值);接着再求一下最短原创 2020-06-29 14:55:56 · 209 阅读 · 0 评论 -
PAT(甲级)1118 Birds in Forest (25point(s))
题目题目链接思路题目大意:在同一张照片里的鸟属于一个树,所以用并查集就可以做了;至于鸟的数量,可以通过set去重存储;代码#include <iostream>#include <vector>#include <algorithm>#include <set>using namespace std;const int maxn = 1e4 + 10;int father[maxn], isRoot[maxn];set<int原创 2020-06-27 18:19:19 · 158 阅读 · 0 评论 -
PAT(甲级)1021 Deepest Root (25point(s))
题目题目链接思路题目大意:给一张图,这个图有点特殊,没有环且边数等于节点数-1,即是一棵树;每个节点都可能是根节点,要求是输出那些作为根节点时树的深度最大的节点;首先要判断是不是联通的,可以用并查集做,可以用图的DFS遍历做;然后如果是联通的话,需要找到那些作为根节点时树的深度最大的节点;这里有一个方法,那就是DFS两次,第一次从任意一个节点出发,假设从1号节点出发,DFS时会遍历所有点,并得到每个点的深度,我们把那些深度最大的点记录下来,存放在temp中;第二次从temp 数组的任意一个元素出发原创 2020-06-26 16:47:17 · 178 阅读 · 0 评论 -
PAT(甲级)1047 Student List for Course (25point(s))
题目题目链接思路题目大意:给出每个人所选的科目,要求按科目输出选择的人有哪些;先来分析一下,我们肯定需要为每个科目开一个数组,存储有哪些人选择了这个科目,但有个问题,名字是字符型的,如果直接存储字符,比较占内存;那么可不可以为每个人赋予一个编号?可以,因为输入时是按人来输入的,一共有n个人,所以我们可以把人从0 - n-1编号;这样就可以在课程数组中保存数字了;注意,输出时要按名字的字母序进行排序后再输出;代码#include <iostream>#include <str原创 2020-06-25 18:03:05 · 136 阅读 · 0 评论 -
PAT(甲级)1024 Palindromic Number (25point(s))
题目题目链接思路题目大意:判断一个字符串是不是回文串,如果不是可以翻转后相加在判断是不是回文串;本质是大数相加问题,大数相加需要先把数字翻转一下,将个位数字放到数组的第0号位,优点是相加的时候进位方便;代码#include <iostream>#include <string>#include <cstring>#include <vector>#include <algorithm>using namespace std;原创 2020-06-25 16:28:15 · 175 阅读 · 0 评论 -
PAT(甲级)1078 Hashing (25point(s))
题目题目链接思路先判断原题hash位置有没有被占用,如果被占用,就进行二次平方探查;代码#include <iostream>#include <string>#include <cstring>#include <vector>#include <algorithm>using namespace std;const int maxn = 1e4 + 10;bool flag[maxn];bool isPrime(in原创 2020-06-24 17:14:44 · 138 阅读 · 0 评论 -
PAT(甲级)1015 Reversible Primes (20point(s))
题目题目链接思路题目大意:判断一个数以及逆序是不是质数;注意:0和1都不是质数,记得特判一下;代码#include <iostream>#include <string>#include <cstring>#include <vector>#include <algorithm>using namespace std;int d[50];bool isPrime(int a){ if(a <= 1) re原创 2020-06-23 18:08:06 · 134 阅读 · 0 评论 -
PAT(甲级)1081 Rational Sum (20point(s))
题目题目链接思路计算分数的加法;1、初始化时将ans 的分子设为0,分母设为1;2、计算过程中,分子,分母都可以为负;3、化简过程中注意三点:分母为负,分子分母都要变号;分子为零,分母要设为1;分子分母可以约分;4、输出过程中分三种情况:整数,假分数,真分数;代码#include <iostream>#include <string>#include <cstring>#include <vector>#include <alg原创 2020-06-23 17:28:01 · 109 阅读 · 0 评论 -
PAT(甲级)1049 Counting Ones (30point(s))
题目题目链接思路题目大意:给出一个数n,找出大小在[0,n]中,且含有数字1的数字个数;从后往前遍历每一位数字,当前遍历的位置 i 将整个数字分为三部分,i 的左边称为left,右边称为right,位置 i 上的数称为now;如果 now = 0,那么左边最大是left - 1,注意从零开始,所以左边有 left 种可能,右边有 a 种可能;如果 now = 1,那么左边可以等于left,但是当左边等于left时,右边只有right + 1种可能;如果 now >= 2,那么左边可以等于原创 2020-06-22 18:27:11 · 148 阅读 · 0 评论 -
PAT(甲级)1008 Elevator (20point(s))
题目题目链接思路每次和上次的楼层比较一下,判断是上楼还是下楼;代码#include <iostream>using namespace std;int main(){ int n, pre, cur, ans = 0; scanf("%d", &n); ans += n * 5;//总的等待时间 scanf("%d", &pre); ans += 6 * pre; for(int i = 1; i &原创 2020-06-22 17:47:42 · 128 阅读 · 0 评论 -
PAT(甲级)1069 The Black Hole of Numbers (20point(s))
题目题目链接思路如果n != 6174就一直迭代,迭代过程中把每个数拆分到一个数组中进行排序,二者做差,如果相等,提前结束迭代;否则继续迭代直到 n = 6174;注意,采用上述写法,如果一开始输入 6174 不会进入迭代,需要特判一下;此外,为了不重复写比较函数,这里借用了一个全局变量,根据 flag 的取值判断排序标准;代码#include <iostream>#include <string>#include <cstring>#include原创 2020-06-20 18:26:09 · 178 阅读 · 0 评论 -
PAT(甲级)1101 Quick Sort (25point(s))
题目题目链接思路题目大意:判断一个数字是否大于他左边的任何数字且小于他右边的任何数字;先把每个数字左边的最大值和右边的最小值统计出来,分别用left 和 right 数组存放,注意,统计的时候不包括自身;再循环一遍,检测每个数字是否大于其左边的最大值并且小于右边的最小值;注意:最后必须有个回车输出,否则如果没有满足题意的数字输出时会发生格式错误;代码#include <iostream>#include <string>#include <cstring&g原创 2020-06-20 17:44:47 · 142 阅读 · 0 评论 -
PAT (甲级)1093
题目题目链接思路把每一个字符以左的P字符个数统计出来,每一个字符以右的T字符个数统计出来,在遍历每一个字符串,如果这个字符为A,那么包含这个A的pat个数为 左边P的个数 * 右边T的个数;注意点:记得对每次结果取余;代码#include <iostream>#include <string>#include <cstring>#include <vector>#include <algorithm>using namespa原创 2020-06-20 10:58:54 · 243 阅读 · 0 评论 -
PAT(甲级)1044 Shopping in Mars (25point(s))
题目题目链接思路题目大意:找出数组片段和大于等于目标值的片段;因为题目要求如果没有片段和等于目标值的话输出大于目标值的最小片段,所以第一步要计算出与目标值相差最小的near是多少;枚举i 从1到n,用二分找到大于等于 sum[i - 1] + m 的下标 j,如果某一个i满足 sum[i - 1] + m = sum[j],则说明可以找到差值为m的位置,直接中断;找到这个最小差值后,再一次二分查找一次,找到 大于等于 sum[i - 1] + near 的第一个位置,如果正好等于的话,就输出 i原创 2020-06-19 16:48:27 · 118 阅读 · 0 评论 -
PAT(甲级)1010 Radix (25point(s))
题目题目链接思路题目大意:给两个数,以及其中一个数的进制,问是否存在一个进制,使得另一个数在此进制下两数相等;首先应该明确用二分对解空间进行搜索,其次需要找到每次优化后解空间的上下界;为了方便,我们不妨始终保持第一个数进制已知;最初解空间的下界是第二个数中最大位 + 1,上界是第一个数转化为10进制后的值 + 1;因为给的radix是很大的,所以本题必须都用longlong型,注意不要想当然认为解空间是 [2, 36], 而应该是 [2, radix];题里还有一个坑,因为给的radix很大原创 2020-06-17 19:09:21 · 157 阅读 · 0 评论 -
PAT(甲级)1038 Recover the Smallest Number (30point(s))
题目题目链接思路题目大意:对一系列数进行恰当的排列,使其值最小;主要是比较函数的书写比较难想,这里用到了string的比较,我们肯定想让 a + b < b + a,所以比较函数可以这样写;另外,不能单独比较 a 和 b,因为在所有前导位都相同的情况下,长度短的肯定比长度长的要大;代码#include <iostream>#include <string>#include <cstring>#include <vector>#inc原创 2020-06-17 17:45:15 · 130 阅读 · 0 评论 -
PAT(甲级)1037 Magic Coupon (25point(s))
题目题目链接思路题目大意:给两个数组,每次从两个数组中各取一个数字相乘后相加,使其结果最大;使用贪心就可以了,由于正数 * 正数,负数 * 负数都是正数,相加都会使结果变大,所以我们不让其进行负数 * 正数的运算;除此之外,a中最大的正数与b中最大的正数或负数相乘结果值是最大的,即最优解;先把两个数组都从小到大排序,这样负数肯定都在前面,从前往后都使两个数组对应位都是负数的位相乘,只要有一个出现正数,结束此次迭代;然后从后往前遍历,使两个数组都是正数的位相乘,只要有一个出现负数,结束此次迭代;原创 2020-06-16 18:28:44 · 137 阅读 · 0 评论 -
PAT(甲级)1033 To Fill or Not to Fill (25point(s))
题目题目链接思路题目大意:给出一些加油站以及他们各自油的价格,问如何选择加油策略使得总花费最小;第一步,我们肯定要将加油站的距离按从小到大的顺序排好;排好后有一种特殊情况特判一下,如果第一个加油站不在起点,那么这个车就哪也去不了,当然应该直接返回;接下来考虑策略的选择;对一个加油站i来说,我们肯定会去看在当前加油站i加满油的情况下最远到达的加油站内有没有比i更便宜的,这里分为三种情况:1、如果有比i更便宜的加油站 j (注意,这里需要选第一个比i便宜的加油站),我们就要看此时油箱中的油能不能到原创 2020-06-16 17:51:17 · 159 阅读 · 0 评论 -
PAT(甲级)1048 Find Coins (25point(s))
题目题目链接思路题目大意:给一个数组和一个目标值,问数组中是否存在两个数之和等于目标值;将数组的数进行hash计数,从小到大一个个枚举;注意:要考虑自身与自身相加等于目标值的情况;尽管每个数都不会超过500,但是目标值会超过500,此时如果hash数组只开了510,会导致越界;代码#include <iostream>#include <string>#include <cstring>#include <vector>#include原创 2020-06-16 15:31:47 · 143 阅读 · 0 评论 -
PAT (甲级)1050 String Subtraction (20point(s))
题目题目链接思路题目大意:把s2中出现的字符从s1中删除,并不需要真的删除,只要对s2中的每个字符做上标记,遍历s1时如果某个字符标记过不输出就可以了;题目虽然简单,但还是有两个知识点的;1、gets函数不能通过编译,要使用 cin.getline(字符数组名,字符长度,结束符),其中结束符默认为 \n;fetchar(); //读取多余字符,包括回车和空格;getline(cin, string); //读取一行到string中,可以读取回车;2、阿斯克码表一共有128个字符,包括可见的不原创 2020-06-16 15:06:39 · 181 阅读 · 0 评论 -
PAT(甲级)1041 Be Unique (20point(s))
题目题目链接思路用散列的方法记录每个数出现的次数,然后再一次遍历给定的数,如果这个数只出现一次,输出结果就可以了;碎碎念今天好菜,本来1095那道排序题写好了的,但是可能由于使用了vector,有个样例超时,气死,再加上昨天也没做题;哎,只能做做水题凑数了,不过那道题我肯定会解决的;解决了再发;代码#include <iostream>#include <string>#include <cstring>#include <vector>原创 2020-06-15 18:09:35 · 121 阅读 · 0 评论 -
PAT(甲级)1083 List Grades (25point(s))
题目题目链接思路题目大意:把分数从高到低排一下,依次遍历每一个分数,如果分数在给定区间内,输出;代码#include <iostream>#include <string>#include <cstring>#include <vector>#include <algorithm>using namespace std;const int maxn = 50;struct node{ char name[11],原创 2020-06-13 22:36:58 · 120 阅读 · 0 评论 -
PAT(甲级)1075 PAT Judge (25point(s))
题目题目链接思路题目大意:这道题分的情况有点多啊。首先是排序标准,一共有3个标尺,第一标尺是总分由高到低,第二标尺是完美题解(也就是完全正确的题目数量)由多到少,第三标尺是id由小到大;排序前要做的准备工作是把每个人的总分,完美解题数量求出来;由于最后输出时全部提交都没有通过编译或者没有提交的人不参与排名,也就是不输出,所以要用一个标记来判断这个人是不是需要参与排名;具体实现是读入每个人的分数是,如果分数不是-1,那么说明有通过编译的提交,则需要参加排名;其次要注意如果一个题没有通过编译,但是这原创 2020-06-13 22:14:10 · 184 阅读 · 0 评论 -
PAT(甲级)1028 List Sorting (25point(s))
题目题目链接思路题目大意:根据不同的排序标准进行排序;核心就是那三个比较函数;直接上代码吧,不难理解;代码#include <iostream>#include <string>#include <cstring>#include <vector>#include <algorithm>using namespace std;const int maxn = 1e5 + 10;struct stu{ int原创 2020-06-13 15:52:08 · 156 阅读 · 0 评论 -
PAT(甲级)1025 PAT Ranking (25point(s))
题目题目链接思路题目大意:给出每个人的考场号和分数,要求输出每个人在各自考场的排名以及所有考场的总排名;每个人定义一个结构体,包括id,考场号,分数,本考场的排名,所有考场的排名;id,考场号,分数在读入的过程中就可以记录,本考场的排名要在一个考场结束后进行排名,所有考场的排名在全部输入完后再进行排序;代码#include <iostream>#include <algorithm>#include <cstring>using namespace原创 2020-06-11 17:36:28 · 187 阅读 · 0 评论 -
PAT(甲级)1012 The Best Rank (25point(s))
题目题目链接思路题目大意:给n个学生的各科成绩,对每一科都进行排名,取排名最好的一科作为该名同学的最终排名;最好把每名同学每科的排名用一个数组Rank[id][4]都预先记录下来,然后在根据下标去查询最好的排名,这样做时间复杂度是最低的,只有排序的nlogn;如何把每名同学各科成绩的排名统计出来?依次以平均成绩,c, m, e作为排序标准将stu数组排序,共循环4次,然后从前往后遍历stu数组,把每名同学这科成绩对应的排名填到Rank数组的对应位置。注意,每名同学的id可以作为Rank数组的下标;原创 2020-06-11 16:48:59 · 199 阅读 · 0 评论 -
PAT(甲级)1077 Kuchiguse (20point(s))
题目题目链接思路这道题不认识的单词有好多,但不影响理解题意啊~~;找到所有字符串的公共后缀;只需要一位位的枚举字符,比较每个字符串的当前位字符是否一样,如果有不一样的就跳出迭代;关于scanf和getline()的问题scanf("%d%d", &a, &b);//不吃空格,但是会自动跳过上一次的空格;也就是他是贪心的,他必须读到字符,并且再遇到回车或空格才会停止;可以试试一次读入两个数字,你输入第一个数字后,只要一直输空格或回车,就会一直是黑黑窗口,他吃不到合法字符是不原创 2020-06-10 17:35:54 · 216 阅读 · 0 评论 -
PAT(甲级)1035 Password (20point(s))
题目题目链接思路依次处理每个字符串的每个字符,判断需不需要修改就可以了;注意,最后输出的时候会有单复数的情况,is 和 are,是不是复数;代码#include <iostream>#include <string>#include <vector>#include <algorithm>using namespace std;int main(){ int n, m = 0; vector<string&原创 2020-06-10 15:50:31 · 116 阅读 · 0 评论 -
PAT(甲级)1058 A+B in Hogwarts (20point(s))
题目题目链接思路用一个变量存储进位,模拟一下就可以了;代码#include <iostream>#include <string>#include <vector>#include <algorithm>using namespace std;int main(){ int a[3], b[3], c[3] = {0, 17, 29}; scanf("%d.%d.%d %d.%d.%d", &a[0], &a原创 2020-06-10 15:01:53 · 148 阅读 · 0 评论