
【PTA】
文章平均质量分 55
无
不牌不改
※ 接受自己很普通
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
PTA 常见坑点
111既不是质数也不是合数原创 2022-04-23 17:30:00 · 511 阅读 · 0 评论 -
C++ STL 常用函数
string 常用函数大小写转换转换为大写:transform (s.begin (), s.end (), s.begin (), ::toupper)转换为小写:transform (s.begin (), s.end (), s.begin (), ::tolower)查找未查找到:s.find ('a') == string::npos,返回1表示未找到,返回0表示找到了从索引为i处开始查找:s.find ('a', i),若找到,返回所在索引位置,没找到返回string::np原创 2022-04-23 17:15:00 · 469 阅读 · 0 评论 -
1086 Tree Traversals Again (25 分)
题目题目链接题解数据结构。这道题的核心在于非递归形式的中序遍历,每次push操作的顺序是树的前序遍历,而pop操作的顺序是树的中序遍历。详细点说,每次push进去的元素按顺序排列就是前序遍历,pop弹出的元素按顺序排列就是中序遍历。问题转化为了已知前序遍历和中序遍历,求后序遍历。扩展思考:已知非递归形式的中序遍历求树的前序遍历和中序遍历会了,那么如果已知前序遍历和中序遍历,要如何求非递归形式的中序遍历呢?双指针,顺序遍历前序遍历序列,遍历到就无条件入栈,入栈后判断另一指针指向的中序遍历序原创 2022-04-22 10:06:12 · 185 阅读 · 0 评论 -
1075 PAT Judge (25 分)
题目题目链接题解结构体。讲一下一些坑点:当没有一个题通过的时候不要输出这个人的信息;当提交了没通过,那么输出的该题得分为0;统计成绩时-1当0算,即忽略没通过的。因为存在成绩为-1的情况,所以先将成绩都初始化为-INF。(核心!)排序优先级:成绩之和AC题的数量学生id这题真狗,debug俩小时。代码#include<bits/stdc++.h>using namespace std;const int N = 1e6+10;int n, m, k;原创 2022-04-21 16:11:40 · 1250 阅读 · 0 评论 -
1064 Complete Binary Search Tree (30 分)
题目题目链接题解数据结构。二叉排序树的中序遍历是单调递增的。完全二叉树具有很好的顺序存储的性质。利用中序遍历和递归,先构造左子树,再对根节点进行赋值,再构造右子树。我是fw。代码#include<bits/stdc++.h>using namespace std;const int N = 1e4+10;int n;int t[N], a[N], idx;void build (int x) { if (x > n) return ; build (x原创 2022-04-20 16:15:57 · 1001 阅读 · 0 评论 -
PAT (Advanced Level) Practice 题目集合(1051 ~ 1100)
1051 Pop Sequence (25 分)#include<bits/stdc++.h>using namespace std;const int N = 1e5+10;int n, m, k;int a[N], b[N];int main(){ cin >> m >> n >> k; for (int i = 1;i <= n;i ++) a[i] = i; while (k --) { stack <int>原创 2022-04-20 10:11:12 · 4945 阅读 · 0 评论 -
1056 Mice and Rice (25 分)
题目题解模拟。看懂题,自己实现就OK了:代码#include<bits/stdc++.h>#define PII pair <int, int>using namespace std;const int N = 1e4+10;int n, gp, o;int w[N]; // w[i]:编号为i的老鼠的重量 int level[N]; // 编号为i的老鼠参加的比赛轮数 (轮数越多排名就越靠前) int sumlevel[30]; // 参加比赛轮数大于原创 2022-04-20 10:09:15 · 179 阅读 · 0 评论 -
L3-020 至多删三个字符 (30 分)
题目题目链接题解动态规划。状态表示:f[i][j]表示前i个字符删除j个后不同的字符串数。首先简单考虑一下,对于第i个字符,我们可以选择删除或者不删除,即f[i][j] = f[i-1][j-1] + f[i-1][j]看个例子cdabnaxy,删除abn和删除bna后得到的字符串都是cdaxy,说明存在多统计的情况,那么我们要减去这些重复的情况。根据上面那个例子可以发现对于一个字符s[i],如果在i之前存在一个x使得s[x]=s[i],那么删除[x,i-1]间的字符和删除[x+1,i]间的原创 2022-04-20 00:16:39 · 1157 阅读 · 0 评论 -
L3-018 森森美图 (30 分)
题目题目链接题解BFS。先看看样例咋出来的吧。判断某个坐标属于起点终点连线的哪一侧的时候,我们采用是将点代入起点终点的两点式中根据正负值判断,两次bfs更新起点到终点的“距离”。bfs每次扩展一个点,用起点到该点的“距离”更新其八个方向上的点的“距离”,如果八个方向上的点保存的“距离”被更新了,则入队,可以用这些点继续更新别的点,否则不要入队了,因为别的点已经由这些点更新过了,再加入个没变的“距离”还是不会有任何效果的,所以直接不入队,节约时间。坑点:注意不要重复统计起点和终点。(这个原创 2022-04-19 20:41:08 · 1262 阅读 · 0 评论 -
L3-014 周游世界 (30 分)
题目题目链接题解DFS。采用的数据结构,vector,索引为起点,值为{终点,起点公司编号},当然你也可以保存终点公司编号,但是代码中的语句就需要改一下了。dfs,传入四个信息,当前节点、遇到的节点数、换乘数、当前节点所在公司的编号。由于存在循环,要加入标记数组进行标记。不敢dfs啊,而且也没想好用什么数据结构,看了大佬的题解才知道如何保存路径,才知道要用dfs,不过好歹最后自己写出来(算是)。代码#include<bits/stdc++.h>#define PII pa原创 2022-04-19 16:44:03 · 728 阅读 · 0 评论 -
L3-007 天梯地图 (30 分)
题目题解两次Dijkstra,分别计算最短距离和最短时间。需要额外开辟数组来保存节点数量信息和路径信息。路径信息一般都是更新每个节点的父亲节点,最后递归输出。我这里是先递归保存到vector中,因为通过vector可以直接判等,从而实现分开两种输出情况。测试点1应该输出距离和时间序列相同的情况;测试点2比较容易卡,建议是算完最短距离后,在计算最短时间时重新更新最短距离和最少节点数,而不是使用计算最短距离后得到的信息。代码比较乱。代码#include<bits/stdc++.h&g原创 2022-04-19 11:59:07 · 495 阅读 · 0 评论 -
L3-005 垃圾箱分布 (30 分)
题目题目链接题解对每个垃圾箱进行一次队列优化的Dijskra,每算出一个垃圾箱到其余各个居民点的最短距离后,计算这些距离中的最大距离、最短距离。如果最大距离大于要求的距离则直接忽略这个位置放垃圾桶的情况;否则,如果最短距离小于已经记录的最大的最短距离或者最短距离等于已经记录的最大的最短距离并且距离均值小于已经记录的最小均值,则更新要输出的信息。优先级:最短距离要最大距离均值要最小垃圾桶编号要小(由于我们是顺序判断每种情况,所以不需要通过该条件进行更新)注意:直接printf("%.1原创 2022-04-19 09:45:15 · 438 阅读 · 0 评论 -
L2-030 冰岛人 (25 分)
题目题目链接题解STL。保存关系时,我们让儿子指向父亲,而不是父亲指向儿子,一个儿子有一个父亲,但一个父亲有多个儿子。查询时,两个人不停地向上找父亲,如果存在一个人的五代内的祖先与另一个人的某个祖先是同一个人,则false,如果没找到,则true。最开始我使用邻接表,再两次bfs,第一次bfs标记第一个人五代内的祖先,第二次bfs找第二个人五代内的祖先是否被标记,存在被标记说明不可行,否则可行。判断方式已经出现了问题,题目要求所谓“五代以内无公共祖先”是指两人的公共祖先(如果存在的话)必须比原创 2022-04-18 11:36:48 · 348 阅读 · 0 评论 -
1049 Counting Ones (30 分)
题目题目链接题解整体思路就是判断每一位上对1的贡献个数。对于一个数abcdef,假设我们看c所在位对1的贡献。当c=0时,贡献为ab * 1000;当c=1时,贡献为ab * 1000 + (def+1)当c>1时,贡献为ab * 1000 + 10001000是因为c所在位的权重为1000。代码#include<bits/stdc++.h>using namespace std;typedef long long LL;LL ans;int n, x, a[1原创 2022-04-17 11:51:52 · 586 阅读 · 0 评论 -
1038 Recover the Smallest Number (30 分)
题目题目链接题解贪心。重点是如何排序。因为排序函数cmp只需要考虑两个字符串的顺序关系,因此我们可以尝试将两个字符串按不同顺序拼起来,比较大小,返回字典序小的那种情况的顺序。我写了个很复杂的排序函数,其实还是没有考虑到排序函数本质就是只考虑局部排序,所以写该函数的时候我们也不必考虑过多,只考虑两个字符串的位置关系即可。代码#include<bits/stdc++.h>using namespace std;const int N = 1e4+10;int n;str原创 2022-04-16 11:00:21 · 635 阅读 · 0 评论 -
1034 Head of a Gang (30 分)
题目题目链接题解并查集。注意坑点:帮派的人数必须大于2。代码#include<bits/stdc++.h>using namespace std;#define PSI pair<string,int>const int N = 1e5+10;int n, k, cnt;int fa[N];int gongw[N]; // 每个人对于帮派的贡献,同一个通话只用记录一个人的,因为如果两个人都修改gongw,最后累加的时候会变成两倍 int w[N];原创 2022-04-16 09:55:52 · 763 阅读 · 0 评论 -
1033 To Fill or Not to Fill (25 分)
题目题目链接题解贪心。1. 将终点视为单位油价为0,离起点距离为d的加油站,然后将所有加油站按离起点的距离从小到大排序。排序后,如果如果离起点最近的加油站距离不是0,则汽车无法出发,直接输出结果。2. 选择下一个车站的策略: 判断是否存在可达的加油站,即将油箱加满能够到达其他加油站? (1)若存在,则判断是否存在比当前加油站油价便宜的加油站? ① 若存在,则我们选择一个最近的且比当前加油站油价便宜的加油站作为目的地,将油箱加至刚好能到目的地,驱车前往; ② 若不存在,则将油箱加满,原创 2022-04-16 08:59:59 · 328 阅读 · 0 评论 -
1012 The Best Rank (25 分)
题目题目链接题解结构体排序。我是写的四个不同的cmp函数,分开进行四次排序,每次更新最小排名,同时记录学科;柳巨是将每个人的四个分数保存成了一个数组,写了一个函数,通过下标控制对哪个学科的成绩进行排序,可以通过循环来实现对每个学科的排序,每次更新最小排名,同时记录学科。代码好看的AC代码:#include<bits/stdc++.h>using namespace std;const int N = 1e7+10;string mp = "ACME";int flag原创 2022-04-11 12:25:44 · 1220 阅读 · 0 评论 -
1010 Radix (25 分)
题目题目链接题解二分+数学。先说几点注意事项:开 LL;最高进制不是35,可以更高;枚举可能的进制时存在爆LL的情况;整体思路:先计算出知道进制的那个数对应的十进制数,二分进制,找到某个进制使得另一个数对应的十进制数与已知的十进制数相等,如果存在则输出最小进制,如果不存在则输出字符串。二分的上界并非z对应的进制,而是可以更大,所以上界应该为已知的十进制数(其实我还是不明白如何确定的这个上界);下界为未知进制的数中出现的最高字符对应的进制+1,再与2取max;写二分的check函原创 2022-04-11 11:13:24 · 1037 阅读 · 0 评论 -
PAT (Advanced Level) Practice 题目集合(1001 ~ 1050)
1001 A+B Format (20 分)题目大意:计算a+b,结果按照西方的那种写数字的方式输出,从三个数一个逗号那种。#include<bits/stdc++.h>using namespace std;int main(){ int a, b, c; string s, ans, flag; cin >> a >> b; c = a + b; if (c < 0) flag = "-"; s = to_string (c); rev原创 2022-04-08 22:03:51 · 4220 阅读 · 0 评论 -
1025 反转链表 (25 分)
题目题目链接题解直接看代码吧,根本没用结构体!柳神无敌!代码#include<bits/stdc++.h>using namespace std;const int N = 1e6+10;int lst[N], dta[N], nxt[N];int main(){ int st, n, k; cin >> st >> n >> k; while (n --) { int add, val, ne; cin >>原创 2022-04-01 22:55:18 · 606 阅读 · 0 评论 -
1075 链表元素分类 (25 分)
题目题目链接题解链表。整体思路比较好想:先创建两个新链表(负数链表和正数链表),按照原串的顺序依次遍历每个节点,将负数节点插入到负数链表中,正数节点插入到正数链表中。再创建两个新链表(小于k链表和大于k链表),按照正数链表的顺序依次遍历每个节点,将小于k的节点插入到小于k链表中,大于k的节点插入到大于k链表中。将三个串头尾相连,最后输出(如果不拼接直接输出的话需要处理很多边界情况,不方便,不如先拼接起来,也就是前一个链表结尾的节点的next指向下一个链表开头的位置)还有一些细节需要处理原创 2022-04-01 21:35:47 · 339 阅读 · 0 评论 -
有关 sscanf 和 sprintf 的用法
sscanf 的用法用法:int sscanf(const char *str, const char *format, ...)功能:从字符串读取格式化输入。返回值:如果成功,该函数返回成功匹配和赋值的个数。如果到达文件末尾或发生读错误,则返回 EOF。说明:从一个C字符串变量中格式化地读取指定类型的数据到新的变量中。举例:#include<bits/stdc++.h>using namespace std;int main(){ char str[1原创 2022-04-01 14:30:16 · 418 阅读 · 0 评论 -
1055 集体照 (25 分)
题目题目链接题解模拟。之所以样例输出如此,是因为第一行其实是排队的最后一排,样例的输出更像是一张俯视图,我们站在最后一行的下一行去给他们拍照,他们面朝下,我们面朝上。至于题目中说的“这里假设你面对拍照者,所以你的左边是中间人的右边”,就理解成每行都是按照先选出最高的人,队伍的最左端(我们的视角)插入一个次高的,再向队伍右端插入一个次次高的……先排序。我是以步长为2分别从右向左、从左向右遍历排好序的每个人,直接输出就行了;但是要注意分该行的人数是奇数还是偶数,奇数和偶数对应的遍历边界不一样。原创 2022-03-31 22:13:12 · 246 阅读 · 0 评论 -
1089 狼人杀-简单版 (20 分)
题目题目链接题解思维。首先我们要明确这类问题不用计算机,我们会怎么去做。显然是推矛盾吧,就是假设哪些是狼人、哪些说了假话等等,根据每个人说的话推出矛盾就说明假设不合理,反之正确。既然要推出矛盾就需要找到一些条件,如果推的过程中发现与条件违背,那么就说明不合理。条件:存在两个狼人一个狼人说谎,一个狼人说实话有两个人说谎我不讲我乱七八糟的错误思路了,直接将柳神的!枚举两个狼人,也就是假设某两个人是狼人(条件1),这也说明了剩下的人都是好人,这是我们的假设,也可以理解为当前枚举到的事原创 2022-03-30 21:29:38 · 387 阅读 · 0 评论 -
1105 链表合并 (25 分)
题目题目链接题解链表。有点像双指针的感觉。整体思路:假设 L1 的长度始终大于 L2 的长度,那么 L1 正序输出2个节点,L2 倒序输出1个节点,直到L2到头。如果 L1 还剩节点未输出,则顺序输出完。处理:比较一下L1和L2长度,如果L2长度长,则交换一下L1,L2;L2要倒序输出,所以需要设置pre,保存每个节点的前面一个节点。我觉得指针最难的还是判断结束(while的结束条件)代码#include<bits/stdc++.h>using namespac原创 2022-03-30 01:03:50 · 423 阅读 · 0 评论 -
1110 区块反转 (25 分)
题目题目链接题解链表。我定义的四个指针如下:目标是将灰色区域移到链表最前端。实现一下上面灰色区域移到最前端的过程:先让p的next指针指向tmp的下一个节点,再让tmp的next指针指向链表的起点,最后更新起点为t指针。(顺序不可变)下面是特殊的最后一块的处理方法:和上面的思路一致,只不过需要控制t和tmp指针的移动距离。链表题我感觉我都像是蒙过的。代码#include<bits/stdc++.h>using namespace std;const int原创 2022-03-29 20:54:19 · 1098 阅读 · 1 评论 -
1104 天长地久 (20 分)
题目题目链接题解第一种做法:需要一定的数学思维+枚举。规定 Sum(A)Sum(A)Sum(A) 表示 AAA 的各位之和。最重要的一点是要想到任意两个相邻自然数的最大公因子只能是1,也就是说如果 Sum(A+1)−Sum(A)=1Sum(A+1) - Sum(A) = 1Sum(A+1)−Sum(A)=1,那么 Sum(A+1)Sum(A+1)Sum(A+1) 和 Sum(A)Sum(A)Sum(A) 的最大公因子只能是1,因此我们必须要让 Sum(A+1)Sum(A+1)Sum(A+1)原创 2022-03-29 17:28:23 · 1593 阅读 · 0 评论 -
PAT (Basic Level) Practice (中文)题目集合
1001 害死人不偿命的(3n+1)猜想 (15 分)1002 写出这个数 (20 分)1003 我要通过! (20 分)1004 成绩排名 (20 分)1005 继续(3n+1)猜想 (25 分)1006 换个格式输出整数 (15 分)1007 素数对猜想 (20 分)1008 数组元素循环右移问题 (20 分)1009 说反话 (20 分)1010 一元多项式求导 (25 分)1011 A+B 和 C (15 分)1012 数字分类 (20 分)1013 数素数 (20 分)原创 2022-03-28 20:15:19 · 17479 阅读 · 0 评论 -
1030 完美数列 (25 分)
题目题目链接题解思维。从小到大排序后,从左开始选取一个数作为 mmm,二分选取右边的数作为 MMM,时间复杂度 O(nlogn)O(nlogn)O(nlogn);注意开long long!代码#include<bits/stdc++.h>using namespace std;const int N = 1e5+10;typedef long long LL;LL p, a[N]; // 注意开 LL int n, ans;int erfen (int l, int原创 2022-03-28 09:09:27 · 408 阅读 · 0 评论 -
1003 我要通过 (20 分)
题目题目链接题解实现题。理解题目表达的意思:字符串中必须仅有 P、 A、 T 这三种字符,不可以包含其它字符;可以在 PAT 左右两侧加任意个相同数量的 A,比如 PAT、APATA、AAPATAA 均是正确的,但 APAT、PATA、AAPATA 均是不正确的。开始递归定义了!“如果 aPbTc 是正确的,那么 aPbATca 也是正确的,其中 a、 b、 c 均或者是空字符串,或者是仅由字母 A 组成的字符串。”找一下规律:由条件2可知,PAT、APAT、AAPATAA原创 2022-03-27 11:54:27 · 570 阅读 · 0 评论 -
PTA L3 题目合集(暂不更新)
L3-003 社交集群 (30 分)并查集,两个人只要存在至少一个相同,那么就算一类。#include<bits/stdc++.h>using namespace std;const int N = 1e3+10;int n, k, a, b, ans;int st[N], cnt[N], fa[N], peo[N];vector <int> fas;int find (int x) { return fa[x] == x ? fa[x] : fa[x] = f原创 2022-03-23 19:42:39 · 424 阅读 · 0 评论 -
L2-039 清点代码库 (25 分)
题目题目链接题解考查STL。set 容器排序详讲set内部本身自带排序函数,也就是说插入set后通过迭代器或者auto输出的结果都是升序排列的;如果想要改变排序方式,可以自己定义一个cmp结构体,重载set<?>中?的()操作符,比如:#define PSI pair<string, int>struct cmp { bool operator() (const PSI & a, const PSI & b) const { if (a.seco原创 2022-03-23 11:34:35 · 917 阅读 · 1 评论 -
L2-029 特立独行的幸福 (25 分)
题目题目链接题解DFS(记忆化)说明:一个数如果先转换成了不在范围内的数后最终转换到了1是允许的,即也可以判定为是幸福数。主要的难点在于如何判断数是否为幸福数、如果是幸福数又如何判断该数是否能由其他幸福数转换而来、统计迭代的次数。在dfs的过程中通过设置数组标记来解决上面的难点。代码#include<bits/stdc++.h>using namespace std;const int N = 1e4+10;int l, r;int dp;int st[N]; //原创 2022-03-22 19:13:14 · 651 阅读 · 0 评论 -
二叉树的前序遍历、中序遍历、后续遍历和层序遍历
题目L2-004 这是二叉搜索树吗? (25 分)L2-006 树的遍历 (25 分)L2-011 玩转二叉树 (25 分)代码L2-004 这是二叉搜索树吗? (25 分)// https://pintia.cn/problem-sets/994805046380707840/problems/994805070971912192#include<bits/stdc++.h>using namespace std;const int N = 1100;int n, a[N]原创 2022-03-22 14:28:09 · 1374 阅读 · 0 评论 -
L2-016 愿天下有情人都是失散多年的兄妹 (25 分)
题目题目链接题解DFS。孩子向父母方向连边,将孩子视为根节点。首先判断输入两个人的性别,如果不同再分别以二者为起点进行dfs,前者五服之内的亲属都标记一下,以后者为起点dfs,如果遇到了标记的人,那么说明五服之内存在公共祖先,不可以结婚。我一直在思考怎么用倍增法计算最近公共祖先,但是死活想不出来,因为一个孩子有一对父母,这和一般的公共祖先还不一样,最近公共祖先是一个父节点有多个节点,而本题是一个子节点有多个父节点;如果将孩子理解为父节点,父母理解为子节点,虽然构造出最近公共祖先问题,但是并不原创 2022-03-22 11:29:49 · 437 阅读 · 0 评论 -
L2-006 树的遍历 (25 分)
题目题目链接题解对先序遍历、后序遍历、中序遍历、层序遍历的理解 + DFS。由后序遍历和中序遍历得到先序遍历后不知道怎么得到层序遍历了,写了好久的记忆化搜索都没写对,最后扫了一眼大佬的,发现就差一点。还是理解不到位,记忆化搜索是弱项。代码#include<bits/stdc++.h>using namespace std;vector <int> v;int a[50], b[50], n, left_val[50], right_val[50]; // le原创 2022-03-21 17:30:54 · 667 阅读 · 0 评论 -
L2-005 集合相似度 (25 分)
题目题目链接题解STL。一开始我用的map,由于使用其size函数,一直出错;我发现map的size函数很不稳定,我是定义的<string,bool>的map,输入一个就map[i][string]=true,但是发现不同时候输出的map[i].size()不同,这就很迷。最后看了别人的博客就用了set。代码#include<bits/stdc++.h>using namespace std;const int N = 1e4+10;int n, m;s原创 2022-03-21 16:34:55 · 299 阅读 · 0 评论 -
PTA L2 题目合集
PTA L2 家庭房产 最长对称子串树的遍历集合相似度列车调度 愿天下有情人都是失散多年的兄妹人以群分 多项式A除以B 悄悄关注 功夫传人紧急救援链表去重 这是二叉搜索树吗?月饼 总结 题解 整理 并查集原创 2022-03-21 14:06:31 · 1438 阅读 · 0 评论 -
L2-001 紧急救援 (25 分)
题目题目链接题解最短路(扩展)算是朴素Dijkstra模板吧。Dijkstra算法额外加上记录路径、记录到达此处的最短距离、记录以最短距离到达此处的最多人数。更新方式:假设未确定距离的点集中的点t距离已确定距离的点集最近,以t对其他未确定距离的点j进行松弛。即:如果从s到j经过t的距离比不经过t短,则说明经过t更好,那么更新j的前一个节点为t,更新到达j的最大人数为到达t的最大人数+节点j的人数,更新到达j且距离最小的路径个数为到达t的路径个数;如果从s到j经过t的距离与不经过t一原创 2022-03-21 12:05:48 · 1070 阅读 · 0 评论