![](https://img-blog.csdnimg.cn/20201014180756926.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
PAT刷题
文章平均质量分 52
Kerin637
这个作者很懒,什么都没留下…
展开
-
1167 Cartesian Tree
题目链接本来以为这道题需要先构建堆,于是专门先复习了堆,后来发现这道题不必也没法构建,因为堆必须是完全二叉树qwq思路也很简单,可以根据小顶堆的特点找到中序遍历数组中的根,进而对左右子树分别递归处理,访问根节点时将值放到对应层的结果中,最后遍历输出每一层的结果即可。#include<bits/stdc++.h>using namespace std;vector<vector<int> > leveltr(31);//最多30层void dfs(vector&原创 2022-05-26 16:36:47 · 274 阅读 · 2 评论 -
1165 Block Reversing
题目链接刚复习完链表,正好做了道链表反转的题目,一遍过,开心~~#include <bits/stdc++.h>using namespace std;int main(){ string head; int N,K; cin >> head >> N >> K; map<string,pair<int,string>> list; for(int i=0;i<N;i++){原创 2022-05-25 20:08:35 · 141 阅读 · 0 评论 -
1164 Good in C
题目链接再次回顾了getline(cin,tmp)的用法,注意getline前面如果有cin或者scanf,要记得用getchar()来吸收换行。测试点1可能形如!!HELLO,即最开始未必就是单词,因此需要先将i和j调整到第一个字母的位置。#include<bits/stdc++.h>using namespace std;int main(){ map<char,vector<string> > mp; for(int i=0;i<26原创 2022-05-25 19:41:02 · 98 阅读 · 0 评论 -
1146 Topological Order
题目链接#include<bits/stdc++.h>using namespace std;int main(){ int N,M; cin >> N >> M; vector<int> ver(N+1,0);//1-N 统计每个顶点的入度 vector<vector<int> > edge(N+1); for(int i=0;i<M;i++){ int v,w;原创 2022-05-18 20:38:54 · 123 阅读 · 0 评论 -
1110 Complete Binary Tree(测试点234 注意结点编号可以是2位数)
题目链接借助队列来判断是否为完全二叉树,从根节点开始将左右孩子入队,当遇到第一个空结点时终止循环,判断队列剩余部分是否还有数字,如果有则不是完全二叉树,如果没有则就是完全二叉树。这道题有点坑的地方是编号小于等于20,即有两位数,所以子结点读取的时候要用string类型才能和“-”统一读取,如果把结点当作个位数测试点234会过不了。#include<bits/stdc++.h>using namespace std;int main(){ int N; cin >&原创 2022-05-14 21:25:06 · 313 阅读 · 0 评论 -
PAT 1104-1105
题目链接测试点3需要用long double才能过…long double用%Lf来格式控制double 用%lf来格式控制#include<bits/stdc++.h>using namespace std;int main(){ int N; cin >>N; vector<long double> nums; for(int i=0;i<N;i++){ long double tmp;原创 2022-05-12 23:19:36 · 98 阅读 · 0 评论 -
c++读入一行
813:00:00 - 18:00:0000:00:00 - 01:00:0508:00:00 - 09:00:0007:10:59 - 08:00:0001:00:05 - 04:30:0006:30:00 - 07:10:5805:30:00 - 06:30:0018:00:00 - 19:00:00基本题意就是输出没有包含的时间段,因为题目保证了给定的两个时间段之间最多只有一个交点,也就是没有区间重合的情形,所以思路就很简单,直接按照字符串的格式读进来排序遍历一遍就好。C++读取原创 2022-04-23 17:58:59 · 5661 阅读 · 0 评论 -
PAT_1070 Mooncake(贪心)
题目链接一开始审错题了,以为只能取全部或者一半的库存,被样例误导了,能取部分库存那么就计算月饼的单价贪心就好了。#include <iostream>#include <bits/stdc++.h>using namespace std;struct Moon{ double num; double price;}moons[1005];bool cmp(Moon a,Moon b){ return a.price>b.price;}原创 2022-03-26 07:53:22 · 405 阅读 · 0 评论 -
1068 Find More Coins (30 分) (DFS)
题目链接直接dfs加点剪枝就能拿到29分,最后一个点全部硬币加起来也小于价格时会超时,这点不好在dfs直接避免,所以直接在输入的时候累加特判一下就好。#include <iostream>#include <bits/stdc++.h>using namespace std;vector<int> ans;bool dfs(vector<int>& coins,int i,int cur){ //对每一个位置都可以选或者不选原创 2022-03-23 09:03:28 · 362 阅读 · 0 评论 -
PAT_1030 Travel Plan (30 分) (dij+dfs)
题目链接这道题就当作dij+dfs练习用的,需要特别留心的就是各个数组、临时变量的初始化问题,不要总是debug的时候才发现是某个地方没有及时初始化导致出错,比如dst数组先初始化为INF,再将dis[src]设置为0,开始dij算法,dfs的时候,记录第二尺度最优的变量也要记得初始化。代码:#include <iostream>#include <bits/stdc++.h>using namespace std;#define maxNode 505#define原创 2021-08-31 11:49:51 · 84 阅读 · 0 评论 -
PAT_1003 Emergency (25 分) (dij)
注意不要手误把w写成i原创 2021-08-30 22:53:54 · 77 阅读 · 1 评论 -
PAT_1021 Deepest Root (25 分) (记录段错误和超时的解决)
题目链接首先跑一遍DFS获取连通分支数,当只有一个连通分支时,再搜索能让树最深的根节点(主要参考《算法笔记》的做法)。记录一下错误:段错误:基本上段错误都是因为数组越界导致的,要么是数组开的不够大,要么访问了数组外的地址,本题中告诉N个结点,接下来N-1行是边的信息,如果for循环写顺手很容易写成i=0;i<N;i++,应该是i=0;i<N-1;i++,当然这还是审题不清的锅。按照《算法笔记》讲的思想,首先从任意节点出发dfs得到一个最深的叶结点集合A,然后从A集合中任意选一个结点原创 2021-08-30 19:22:03 · 261 阅读 · 2 评论 -
PAT_1013 Battle Over Cities (25 分) (dfs求连通分支数)
题目链接将题目翻译过来就是求去掉某一顶点后的连通分支数-1,因为要保持剩余的城市彼此之间是connected的,只需要在连通分支间添加一条公路即可。可以用dfs求图的连通分支数,占领一座城市需要将该城市关联的边都要去掉,对dfs的影响其实就是无法访问该顶点关联的边,在dfs之前提前vis[该顶点]=true,这样深度优先搜索的时候遇到该顶点就不会搜他的邻接点,也就相当于去掉了该城市所有关联边的效果。比较弱智的是一开始手误将G[v].push_back(w);G[w].push_back(v);原创 2021-08-29 23:30:29 · 147 阅读 · 0 评论 -
PAT_1076 Forwards on Weibo (30 分) (BFS)
题目链接要注意理解好题意,题目input给的是某人v关注了哪些人,而不是v被那些人关注,输出要求统计一个人发动态在L限制内有多少人转发,因此建图时v关注了w,则有一条w指向v的边,表示w发动态v会转发,这样v是w的邻接点,感觉这道题坑就坑在如何建图了。另外注意memset第三个参数是字节数,所以想让前N+1个位置重新置零需要传递4*(N+1),保险起见还是用sizeof(inq)吧。#include <iostream>#include <bits/stdc++.h>u原创 2021-08-29 22:31:05 · 64 阅读 · 0 评论 -
PAT_1034 Head of a Gang (30 分) (dfs)
题目链接第一步建图,需要进行字符串hash,但是给的字符串由3位大写字母表示,直接按照26进制转换为10进制表示的话最大为262626,顶点编号这么大显然开辟邻接矩阵会爆栈,因此想到直接用map进行映射,使用两个map,第一个map记录字符串到顶点编号的映射,第二个map记录顶点编号到字符串的映射。建立映射时,顶点编号idx从0开始,如果遇到第一个map中不存在的key,则将此字符串作为键、idx作为顶点编号存入,并id++,最终id其实也就是最终顶点的数目。特别要注意的是,题目给了n条通话记录原创 2021-08-28 23:29:48 · 142 阅读 · 0 评论 -
PAT_1038 Recover the Smallest Number (贪心)
题目链接之前刷力扣貌似做过一样的题,当时直接看的题解,再次做这道题时只记得就是自定义排序方式而已,推了好一会排序比较方式才想起来正解是什么,所以还是自己写出来的印象深,只看题解的效果不如自己动脑想出来,叨叨完毕。既然是贪心,就是想让两个数字组合起来的数字最小,所以只需要定义一种排序方式,把“小”的数字排在前面,“大”的数字排后面。开始时想法是比较这俩数字字符串,同长度按字典序返回大小,长度不同时看短的那部分是否一样,不一样也是按字典序返回大小,一样就再比较长的字符串去掉相同部分剩余部分与前面重合部分循原创 2021-08-25 17:24:07 · 89 阅读 · 0 评论 -
PAT_1033 To Fill or Not to Fill(贪心)
题目链接一开始大体贪心的思想是差不多的,在当前能覆盖的范围内找价格最便宜的加油站,根据情况选择从当前加油站加满还是到下一个加油站进行加油。但是这并不完全正确,应该是从当前位置能覆盖到的范围内先找是否有比当前加油站a还便宜的加油站b,如果有则从a恰好运动到这种加油站b,否则找一个覆盖范围内最便宜的加油站c,然后从a加满油运动到c,在进行迭代判断。因为加满的情况到加油站c还会剩余油,这样在选择去下一个加油站的时候需要加的油就要考虑到参与的油量(即要减去这部分)。这里作差为负的情况是不存在的,因为假设为原创 2021-08-24 23:53:39 · 63 阅读 · 0 评论 -
PAT_一些记录
1.1050 String Subtraction (20 分)采用hash的思想来删除还是挺巧妙的原创 2021-08-23 20:39:35 · 61 阅读 · 0 评论 -
PAT_1082 Read Number in Chinese
题目链接整体思路,读入int,首先判断正负,单独输出“Fu”,然后转化为正数处理;将数字转化为字符串存储(0-8位),高位在前,即位置0存的是亿位,位置8存的是个位;从第一个非零位置开始输出,对应位数字非0,则输出该数字及对应的位名;若对应位数字为0,按照规则,亿万个其实是3个分界,亿和万之间、万和个之间至多读一个零,也可能不读零,连续的0只需要读一次,并且不需要读对应的位名,若在万位或者个位之前零中断了就读出零,如10021002读为一千零二万一千零二,如果连续的零跨过了万或者恰好在万位处断则不原创 2021-08-23 15:46:18 · 198 阅读 · 0 评论 -
PAT_1046 Shortest Distance(前缀和)
题目链接很容易想到用前缀和,想记录一下如果把前缀和数组sum[i]理解为1号结点到i+1结点的距离,这样sum[N]就是一圈的距离,相求dis(i,j)就是tmp=sum[j-1]-sum[i-1]与sum[N]-tmp两者小的那个#include <iostream>#include <bits/stdc++.h>using namespace std;int dis[100005];int sum[100005]={0};int main(){ int N原创 2021-08-22 15:34:28 · 71 阅读 · 0 评论 -
PAT_1023 Have Fun with Numbers (20 分)
题目链接因为至多20位数字,使用unsigned long long只能得到一部分分数,因此需要手动模拟一下大整数的乘法运算,通过carry变量记录进位,乘到最后还剩下的进位要记得输出,实际相当于进行了一个0+carry。完整代码:#include <iostream>#include <bits/stdc++.h>using namespace std;int main(){ string x; cin >> x; vector&l原创 2021-08-18 16:23:16 · 64 阅读 · 0 评论 -
PAT_1017 Queueing at Bank
题目链接这道题其实思路还是挺清晰的,用一个结构体记录顾客到达时间begin及需要处理的时间长度span,存到结构体数组records中,到达时间用string类型存储,调用sort函数依据字典序排序。对于抵达时间超过17:00:01的顾客直接忽略;模拟排队的过程,根据先来后到的原则,先来的顾客会去先完成业务的窗口,可以维持一个窗口的优先队列,也是存储string类型的时间,表示该时刻时才能接待业务,初始化因为银行8点上班,所以K个窗口时间初始均为“08:00:00”;对于已经排好序后的recor原创 2021-08-15 17:45:40 · 181 阅读 · 0 评论 -
PAT_1016 Phone Bills (25 分)
题目链接这道题就是乍一看很麻烦,其实稍微复杂一点的地方只是统计花费金额上,采用《算法笔记》上计算两日期差值的算法套过来就可以计算金额了,不过确实理解题意以及如何处理on-line和off-line匹配及舍入关系和理解话费计算还是挺花时间的。总结一下:首先定义结构体存储这些订单信息,按照字典序输出人名很简单,无非就是按照字典序排序后再挨个处理;on-line和off-line的匹配问题, 其实把时间按照先后排序之后,匹配关系及舍掉哪些订单就很显然了,将时间戳存储为字符串,就可以直接用string原创 2021-08-14 18:51:38 · 361 阅读 · 0 评论 -
PAT_1015 Reversible Primes (20 分)
题目链接其实这道题就是理解题意,一开始比较懵逼的是23怎么在2进制下存在,后来把23写成10111,反转得到11101,也就是29之后,明白了23 2输出Yes的原理,其实这个就是说给的N还是十进制表示的,要求他在D进制下的表示的逆转再换回十进制看是不是素数,还要注意测试点3也要求判断原来给定的N是不是素数。···#include <iostream>#include <bits/stdc++.h>using namespace std;bool isPrime(i原创 2021-08-14 11:19:21 · 96 阅读 · 0 评论 -
PAT_1078 Hashing
题目链接果然期末考完哈希就忘的差不多了qwq开始只得了17分,原因是判断素数忽略了1以及处理冲突出错,后来纠正素数判断和处理冲突后得到20分,因为一开始用了loc,后来处理冲突寻找新位置新定义了newloc,结果即便找到新位置也一直输出的原始loc导致测试点3一直不通过,所以找不出问题的时候还是重新写一遍代码,隐藏错误太看看出来了。总结一下本题的收获:1.判断素数的函数要能判断出≥1的所有数,1不是素数这个特例要记得特殊处理;(以为姥姥不会考1,结果1占测试点0的3分)2.冲突之后$H_i=(原创 2021-08-12 15:21:37 · 185 阅读 · 0 评论 -
PAT_1010 Radix (二分,溢出处理)
题目链接这道题其实思路并不难,将已知进制的数字转化为十进制,然后枚举未知数字的进制也转化为十进制来比较,顺序查找的话会TLE,鉴于进制越大对应转化得到的十进制数字也会很大,即是递增的,因此可以用二分查找。但是此题还有很多坑点:1.首先转化为十进制后有些数据也是超long long的表示范围的,有两种解决方式:① 采用unsigned long long,但是要小心的是无符号数0一旦减1就会得到很大的数,因此使用typedef unsigned long long LLU之后,一定要小心在for(原创 2021-08-11 21:29:22 · 127 阅读 · 0 评论 -
PAT_1088 Rational Arithmetic
题目链接1.单独写一个函数ration来传入分子和分母,输出为给定要求的 k a/b的格式即可,if-else比较多,但是思路不难,因此需要快动手;计算得到±*/中间值也是传给ration来输出;2.因为乘积可能overflow,因此需要定义long long;3.注意审清题目:分母为0输出Inf 而不是inf ,一定要仔细!4.还有牛客网报如下错,可能的原因是本应该有返回值的函数没有写return语句造成的,在本地及PTA上都能过,但是牛客OJ过不了qwq段错误:您的程序发生段错误,可能是数原创 2021-08-09 22:42:17 · 99 阅读 · 0 评论 -
PAT_1007 Maximum Subsequence Sum (测试样例5不通过进)
题目链接前几天刚从力扣做了最大子序列和问题,使用动态规划可以很容易求出最大子序列和是多少,令dp[i]表示以num[i]为末尾的子序列中的最大子序列和,则状态转移方程dp[i]=max(dp[i-1]+num[i], num[i]); 也就是以num[i]结尾,要么与前面的dp[i-1]结合起来,要么就是自己为营;其实观察这个式子,自己为营的时候无非就是dp[i-1]<0的时候,前面的累加和小于零之后自然对最大子序列和没贡献了,所以以num[i]开始重新寻找。最大子序列和就是max(dp[i])。原创 2021-08-09 17:03:36 · 310 阅读 · 0 评论 -
PAT_1006 Sign In and Sign Out
题目链接这个题涉及时间的比较,一开始用的小时分钟秒分别比较的方式,这样是比较麻烦的,实际上可以把时间存储为字符串,直接按照字典序比较即可。小时分钟秒分别比较的方式:#include <iostream>#include <string.h>#include <bits/stdc++.h>#include<cstdio>using namespace std;struct Record{ char id[16]; int h1原创 2021-08-09 13:34:07 · 80 阅读 · 0 评论 -
PAT_1054 The Dominant Color (20 分) 寻找众数
题目链接题目也就是2242^24224看起来很吓人,其实这个数字无非是16 777 216,连int都没超,而且根据题意无非是最多600800个数字,每个数字最多600800,但是开数组直接拿下标映射显然不行,所以选择用map统计即可,或者采用vector存储所有数字,因为dominant color出现半数以上,那么排序后最中间的那个数字也即是众数,因此也可以排完序获取中间数字(因为下标从0开始,所以取得数字是color.size()/2 )。因为题目说了dominant color要超过半数,所以原创 2021-08-07 10:48:12 · 81 阅读 · 0 评论 -
PAT_1081 Rational Sum (20 分)
题目链接思路很简单,先求所有分母的最小公倍数,即通分后分子相加,common就是最小公倍数,也是通分后的分母,获取整数部分resint=resa/common,获取分数部分的分子resa=resa%common,分母就是common,还需要进行约分,首先需要求分子分母的最大公约数,要注意分子为0时不能用gcd求最大公约数,因为用gcd辗转相除用到较小数当分母,而分母不能为0.开始写的代码在pta练习集提交满分,但是在牛客网上对于下面的样例我的程序错误输出了1/-3,发现求-1和3的最大公约数时,因为3%原创 2021-08-07 00:21:30 · 80 阅读 · 0 评论 -
PAT_1077 Kuchiguse (20 分)(最长公共后缀)
题目链接此题主要学会使用reverse函数反转字符串,然后两两比较得到最长的公共尾缀并更新,最后记得反转回来。同时也注意学习string中substr函数的用法,参考特别需要注意的还是cin了int变量之后,再使用getline之前,一定要用一个getchar()吸收多余的换行···#include <iostream>#include<bits/stdc++.h>using namespace std;int main() { int N;原创 2021-08-06 23:01:19 · 79 阅读 · 0 评论 -
PAT_1103 Integer Factorization (30 分)(DFS+剪枝)
题目链接题意还是很好理解的,朴素版本的DFS也是很容易写出的,K的大小就是dfs 的最深的层次,关键在于剪枝。没有进行剪枝时连样例169 167 3都无法在规定时间跑完,但是提交上去还是能拿23分的,(30)说明陈越姥姥还是很仁慈的。以下四处改动才逐步把分数拿满,第一处的剪枝保证了诸如样例169 167 3这种能过,因为从大的底数进行查找,当169=53+....169= 5^3 +....169=53+...., 如果没有这层剪枝,将会一直搜索下去,会169=53+23+13+13....169原创 2021-07-31 20:09:45 · 120 阅读 · 0 评论 -
PAT_1022 Digital Library (30 分)
题目链接这个题的思路很简单,构造一个Book类来存储一本书的这些信息,将所有书籍存到一个对象数组中,调用sort函数依据id进行排序,然后对每个query在对象数组中顺序查找输出即可,不过Sample Output这里提醒结尾没有空行,但是自己写的程序最后会多输出一个回车换行,但是提交也能满分通过,不知道对于多余换行真正考试会不会卡qwq。这个题暴露了自己对于C++的输入输出还是掌握的不好,记录一下做这个题的一些注意的点和收获:1.cin遇到空格就会停止读入,因此用它无法读入一段带有空格的字符原创 2021-07-29 09:41:53 · 120 阅读 · 0 评论 -
PAT_A1044 Shopping in Mars 滑动窗口
题目链接题目大意就是给一个数组从中找到连续的子序列之和等于给定数的所有方案,如果没有等于给定数的子序列就输出大于等于该给定数代价最小的方案。因为涉及到连续的子区间求和,而且每个数都是正数,自然就想到用滑动窗口来解决,一共进行两次滑窗,第一次找到大于等于给定数代价最小的总和money,第二次输出所有等于money的方案数目。#include <iostream>using namespace std;int main() { int N,M; cin >>原创 2021-07-25 09:43:54 · 119 阅读 · 0 评论 -
PAT_a1092 To Buy or Not to Buy
题目链接:https://pintia.cn/problem-sets/994805342720868352/problems/994805374509498368思路很简单,利用一个数组记录各个颜色蛋糕的数目,因为颜色只用[0-9] [a-z] [A-Z]来表示,因此可以直接采取 [字符-‘0’] 的方式得到下标,从而建立存储位置和数目的映射关系,然后依据题意进行模拟即可。#include <iostream>using namespace std;int main() {原创 2021-07-17 21:46:08 · 94 阅读 · 0 评论