PAT
一笑照夜
一片柳叶吹成雪
展开
-
PAT (Basic Level) Practice 1002 写出这个数
一、概述做advanced的题做的快自闭,A1004的题目应该和层次遍历有关系,不想写,做点basic的歇歇。但这个1002可日了狗了。1002很简单的思路,给一个特别大的数,求它的各位和,数太大用double都不行,那就用char。我的思路特别弱智,char存数组,sum存各位和,sum转char,输出各位。因此需要两个char。这就出现了特别奇怪的bug。二、代码及分析#in...原创 2019-01-18 15:01:50 · 201 阅读 · 0 评论 -
PAT (Basic Level) Practice 1008 数组元素循环右移问题
一、概述1008很经典的循环右移问题,主要是oj上有几个坑可以记录下来看看。循环右移一般就是倒过来,倒过来再倒过来,很简单,但是会有一些小地方让你没法子达到满分,这就很蛋疼。二、分析如果仅仅只是反转三次,五个样例只能对两个。还有三个是错的。1、右移为0。直接通过判断进行输出。if (m == 0){ i = 0; while (i + 1 != n) { ...原创 2019-01-20 12:38:34 · 186 阅读 · 0 评论 -
PAT (Basic Level) Practice 1018 锤子剪刀布
一、概述输入若干次两人对战记录,输出双方各自胜负平的次数,并输出胜率最高的出法,若有胜率相等的,按字典序输出。本题易错点在于利用scanf记录输入的字符时容易出错。以及按字典序输出时容易写的很麻烦。我就是这样。二、分析1、输入样例如下10C JJ BC BB BB CC CC BJ BB CJ J如果直接按scanf("%c %c",&...原创 2019-01-20 14:47:19 · 102 阅读 · 0 评论 -
PAT (Basic Level) Practice 1010 一元多项式求导
一、概述给出一个一元多项式,求出它的导函数。令人尴尬的一道题。本质上考点就是while-EOF的运用,如果没有这一点还是很简单的。关键就在于输入既没有个数限制又没有尾部特殊符号,这样一来平时使用的输入方法都无效了,所以代码写的很是蛋疼。二、分析我最开始是用判断输入是否为‘\n’来判断输入完成的,发现oj直接报错。然后使用EOF,关于EOF有以下几点注意:我使用的是VS2...原创 2019-01-27 14:56:10 · 163 阅读 · 0 评论 -
PAT (Basic Level) Practice 1041 考试座位号
一、概述输入试机号,输出考生号和考试号,很简单的一道题,考点主要在char的输入上。本题中应强化对char输入的理解,另可尝试使用C++中的cin和cout,对于字符串类型的输入输出有极大优势。二、分析1、使用C的方法为了偷懒我先定义了结构体代表每个考生,开一个结构体数组,角标就是试机号。如下struct ExamNumber{ char num[15]; int ...原创 2019-01-27 16:15:31 · 118 阅读 · 0 评论 -
PAT (Basic Level) Practice 1036 打印正方形
一、概述题目本身非常简单,给出组成正方形的元素和正方形的边长,将其打印出来,行数是列数的一半,按四舍五入计。记录下来的主要目的是有关在其中用到的一个小技巧,即C中除法的四舍五入。二、分析在C中,对于b=a/2进行四舍五入,可以按如下方法float a;int b;b=(int)(a/2+0.5);这样求出的b就是a除以2之后四舍五入的值了。本题即可迎刃而解。三...原创 2019-01-29 21:16:55 · 102 阅读 · 0 评论 -
PAT (Basic Level) Practice 1031 查验身份证
一、概述给出一个身份证号码,判断是否符合规定。很简单的一道题,避过坑,使用两个数组和cin,cout,十分钟就可以写完。测试点的坑有两个:X是大写;不符合规定的号码里的元素可能有除了0~9和X以外的字符。二、分析对于此类字符各位一一对应类问题,采用开数个数组的方式效率最高。身份证号很长,用数组存储太笨重了,极力推荐string。开两个数组,权值数组以及转换数组。...原创 2019-02-02 23:01:43 · 218 阅读 · 0 评论 -
PAT (Basic Level) Practice 1009 说反话
一、概述输入由一个空格隔开的多个单词,反序输出。很简单很直观的一道题,我却在上面栽了快两小时。最终也只是过了两个测试点,测试点1和2,0和3死活过不去。简直气死。二、分析方法1、我的方法由于之前码的代码大多数在单片机上跑,所以对空间敏感度十分敏感,能少用数组就少用。所以思路如下:利用while-EOF来将整个句子输入到字符数组中。char sen[81];int...原创 2019-02-03 02:25:10 · 168 阅读 · 0 评论 -
PAT (Basic Level) Practice 1048 数字加密
一、概述给出两个数字A和B,按位分奇偶进行操作。很简略的一道题。其坑的程度对于我来说直逼PAT A1002。二、分析给出加密用正整数A以及待加密数B,从个位开始,以个位为第一位,分别按奇偶进行处理。好,到这里还是正常,接下来的隐藏条件就得一点一点猜了,如果两个数不一样长,会出现什么情况?以下是我的猜测:根据给出的例子,B比A长,B的剩余部分直接成为结果。则推测A比B长的时候不输...原创 2019-02-04 04:13:52 · 154 阅读 · 0 评论 -
PAT (Advanced Level) Practice 1111 Online Map Dijsktra加DFS
一、概述求出起点到终点的最短路径和最快路径。最短路径相同,选最快的,最快路径相同,选节点最少的。首先要理解oneway指的是单向路。然后才能往下做。第一眼就看出来了是用Dijsktra加DFS,但是最开始还以为求节点最少要用BFS,后来才发现还得用DFS,因为BFS没法保存路径。剩下的就是代码实现了。因不熟练,所以debug加上思考还花了一点时间。实际上算法写的熟练了可以一...原创 2019-03-03 20:39:32 · 98 阅读 · 0 评论 -
PAT (Advanced Level) Practice 1053 Path of Equal Weight 普通树的DFS及路径保存
一、概述给出一棵树(非二叉树),输出所有符合条件的路径。当题目要求由根节点到叶节点的路径时,我们使用DFS实现。二、分析因为是普通的树,因此每个节点的孩子节点数量未知,需要使用vector来记录,结构体如图:struct node{ long long int weight; vector<int> child;}node[100];然后输入权值和节点...原创 2019-02-27 13:27:47 · 107 阅读 · 0 评论 -
PAT (Advanced Level) Practice 1108 Finding Average 指定格式字符串筛选
一、概述20分的题,我做了一小时还没AC,气死。原因在于不知道有两个很好用的函数。这两个函数在筛选指定格式字符串时很好用。sscanf(char[],"格式",&int/float....);sscanf的参数如图,第一个参数是一个字符数组a,第二个参数是格式,参照正常的scanf的格式,第三个就是我们要把从字符串中取出的符合格式的东西保存的变量了。sprintf(char...原创 2019-03-03 18:09:09 · 146 阅读 · 0 评论 -
PAT (Advanced Level) Practice 1110 Complete Binary Tree 判断完全二叉树
一、概述25分题,正常来讲应该45分钟之内做完,我用了快90分钟,日日了狗不说,还没AC。究其原因,在于我做这道题时,只想着从最直观的角度出发,用人脑的方式,也就是我平常的判断方式,判断一棵树是否是完全二叉树,这是不行的,按我的方法:先建树;BFS得到各节点层数以及每层的节点,按顺序;BFS得到树高;根据树高,先从第一层到倒数第二层,看节点数量是不是满的;若不是满的,则...原创 2019-03-03 17:23:04 · 180 阅读 · 0 评论 -
PAT (Advanced Level) Practice 1020 Tree Traversals 中序加后序等于二叉树,层序遍历
一、概述给出一棵二叉树的中序和后序遍历,求其层序遍历。408时DS部分很喜欢出的题,现在要用代码实现。原理很简单。首先用一个函数重建二叉树,然后层序遍历即可。第一次做还是有几个小坑的。二、分析首先是重建二叉树。代码如下:Node* create(int inhead, int inend, int posthead, int postend){ if (pos...原创 2019-02-27 10:38:26 · 106 阅读 · 0 评论 -
PAT (Advanced Level) Practice 1033 To Fill or Not to Fill 贪心算法
一、概述这是一道考察贪心算法的题目。我在设计算法的时候想错了,我是这样思考的:设置窗口为满油时能跑的距离,以加油站为左端点的窗口长度的范围内,寻找油价最低的加油站,并驱车前往。这是错误的。如下:设置区间内有三个加油站a,b,c,油价分别为6,4,3,左端点油价为5,那么按照我的想法,则是直接从左端点加油,油量为加完之后恰好能开到c加油站的油,那么我加油的单价就是5;但是正确的思...原创 2019-02-26 22:13:28 · 115 阅读 · 0 评论 -
PAT (Advanced Level) Practice 1093 Count PAT's 遍历一次以保存从起点到某点的数据
一、概述给出一段字符串,输出按顺序能组成的PAT的个数。例如APPAPT,按顺序有第2,4,6三位和3,4,6三位可以组成PAT。按照通常的直接做法就是遍历,看该位是不是P,是P往下遍历找A,是A往下遍历找T。这得累死。按照最夸张的,PAAAAAAAAAA一大堆AT,查这个PAT得遍历整个字符串。不可接受。观察可以得到能够组成的PAT的数量是A左边的P的数量乘以A右边的T的数量...原创 2019-03-11 21:00:25 · 106 阅读 · 0 评论 -
PAT (Advanced Level) Practice 1091 Acute Stroke BFS应用
一、概述分块,计算各块和,和大于t的相加,然后输出。DFS会爆栈,因此使用BFS较好。需要使用三维数组,两个。第一个存储0或者1,第二个存储是否入过队列。注意,第一个类型为int,第二个为bool,如果第二个也是int会内存溢出。一定要注意三维数组A[z][y][x]的下标的含义。我是按一行然后一片那样输入的,因此z表示竖坐标,y表示纵坐标,x表示横坐标。这个很容易就晕了。...原创 2019-02-26 20:35:15 · 132 阅读 · 0 评论 -
PAT (Advanced Level) Practice 1136 A Delayed Palindrome 字符串翻转
一、概述就是我们平常说的数字黑洞问题。判断一个数字是不是回文数,如果是,输出,不是,则翻转相加继续判断。题很简单,体现我是一个智障的本质。我直接就随便设了两个字符串a和b各十五位,寻思怎么也够了,然后就字符串判断,翻转,atoi转int,再sprintf转字符串。没看见人家说的最大输入不超过1000位。我用atoi溢出,换atol,再换atoll,简直逗比,你就算是long l...原创 2019-03-06 16:28:59 · 162 阅读 · 0 评论 -
PAT (Advanced Level) Practice 1137 Final Grading 取整要看清
一、概述筛选。首先上级部分没到200筛掉。然后排序输出所有总分大于60的。唯一的坑点:分数都是整数,但是当乘以一个系数后会出现小数。这时就要注意题目中怎么要求取整的了。我原来是以为每次乘完之后的结果都要四舍五入,但是注意要求是“Gmust be rounded up to an integer”,即G要向上取整,因此最后一个测试点没过。二、分析首先用map映射名字与编...原创 2019-03-06 16:56:32 · 240 阅读 · 0 评论 -
PAT (Advanced Level) Practice 1138 Postorder Traversal 不重建树,求后序遍历
一、概述题目只要求输出后序的首位,实际上输出整个后序遍历也差不多。下面的代码即以输出整个后序为例分析。二、分析看题目可以得知最多有上万个节点,因此重建树方法不能用了,铁定超时。我们要选择直接输出后序的方法。先看给出的:前序遍历和中序遍历。我们分析后序遍历,输出的第一个应该是从下往上从左往右第一个叶子节点,然后输出另一个叶子节点(如果有的话),然后输出它的父亲节点,然后输...原创 2019-03-06 18:26:26 · 117 阅读 · 0 评论 -
PAT (Advanced Level) Practice 1114 Family Property 并查集应用
一、概述题设太麻烦了,就是用并查集。唯一的误区就在于,我错误理解了并查集的意思。我本以为,并查集执行完所有合并操作后,属于同一个集合的元素,他们的father数组对应的值都相等,实际上,是这些元素的fingFather的返回值都相等。这个错误让我debug了好久。难过。二、分析首先是观察数据。数据有本人、父母、孩子、房产数量、房产面积。考虑使用两个数组,一个是father数...原创 2019-03-04 11:14:04 · 100 阅读 · 0 评论 -
PAT (Advanced Level) Practice 1066 Root of AVL Tree 眼瞎只能怪自己
一、概述建一棵AVL树。代码挺复杂的,我调了一下午,因为有一个错误和一个段错误。实际上最后发现错误就是一个本应是=的地方我打成了==。一切需要复制黏贴的地方,都容易出错。简直气死。二、分析首先,我们要明确这一点,AVL树是BST进化而来的。所以建AVL树也和建BST树大体上差不多。一般插入法建树我们使用引用法,即声明一个insert函数,变量是node*&和...原创 2019-03-07 19:48:43 · 138 阅读 · 0 评论 -
PAT (Advanced Level) Practice 1100 Mars Numbers getline的使用和string的处理
一、概述数字与字符串的互相转换。题目很容易理解。可最开始的实现害苦了我。字符串的坑还是多。如果不用getline函数,那下面这种情况就很麻烦:elo nov这个作为输入,那么输出应该是115,elo对应115/13=8,noc对应115%13=11。但是问题来了,这俩一起组成一个数字,我怎么才能把他们俩作为一个数字看待呢?用cin不行,遇到空格就不输入了,%s输入也一...原创 2019-03-11 17:40:07 · 123 阅读 · 0 评论 -
PAT (Advanced Level) Practice 1153 Decode Registration Card of PAT 字符串处理综合
一、概述给出若干考生的考生号,每位意义不同。找出满足条件的考生。字符串处理问题。我的解题思路还是有很大缺陷的。一开始我就确定了思路:利用sscanf分解考生号,使用结构体储存每一位考生的信息。然后遇到了第一个问题,sscanf不会用。调函数调了半天,调好了。然后开始处理三种询问。注意这里,要有一个中心思想,就是仅处理“合法的”,用字符串的角度处理。否则会犯和我一样的...原创 2019-03-13 15:48:27 · 121 阅读 · 0 评论 -
PAT (Advanced Level) Practice 1131 Subway Map DFS遍历图找最短路径
一、概述图论求最短路径问题。采用三种方法分别解决。1、Dijkstra加DFS,邻接矩阵法(只能证明样例正确,因为开10000*10000的矩阵直接报内存溢出)2、Dijsktra加DFS,邻接表法3、直接DFS。二、分析1、Dijkstra加DFS,邻接矩阵法由于是求图的最短路径问题,第一时间想到Dijkstra和DFS联合使用。思路如下:①、邻接矩阵记录两点...原创 2019-03-13 17:11:11 · 194 阅读 · 0 评论 -
PAT (Advanced Level) Practice 插入排序和堆排序
一、概述给出初始序列和进行一些步骤后的序列,让你判断进行的这一些步骤是插入排序还是堆排序。判断之后输出下一步的序列。主要考察插入排序和堆排序的实现。二、分析首先考虑插入排序。令第一次排序后前一个元素有序,偷鸡方法是使用sort,直接对前n个元素排序就是第n次的插入排序结果。如果乖乖的按插入排序做,就是像我下面这样:for(int i=1;i<N;i++){...原创 2019-03-13 20:36:22 · 185 阅读 · 0 评论 -
PAT (Basic Level) Practice 1024 科学计数法 & PAT (Advanced Level) Practice 1073 Scientific Notation
一、概述给出一个形如+1.23400E-03的科学计数法表示的数字,输出它的十进制表示。有三种可能性:1、指数为负,前添零;2、指数为正,后添零;3、指数为负,右移小数点。第三种情况可能会忘记,导致有一个测试点过不去。二、分析观察给出的数字,使用string存储。分成五部分:数字符号、数字整数部分、数字小数部分、指数符号、指数部分。要从一个string中...原创 2019-02-04 00:44:19 · 181 阅读 · 0 评论 -
PAT (Advanced Level) Practice 1010 Radix 二分法
一、概述给出两个数和其中一个数的进制,求相等时另一个数的进制。我做的时候就很奇怪,这进制也没给范围啊,以为默认是进制36,因为z代表35就按这个写了。结果错很多(这题的样例是真的多),看来坑点就在这个进制范围上。要注意一点,对于不同的数字,进制的可能范围不同,进制的最小值为数字每位中的最大值加一,而最大值则可能是另外一个数的十进制值加一。因为如果进制超过了另外一个要比较的数加一,那就不...原创 2019-03-02 22:25:30 · 133 阅读 · 0 评论 -
PAT (Advanced Level) Practice 1103 Integer Factorization DFS应用
一、概述给出一个整数,求他分解为K个P次幂的整数的和。用DFS来做,由于P至少为2,N最大为400,因此单个加数的最大值为20。那么就可以变为DFS的应用,即求20个数当中,满足条件的数列,都求出来,然后找满足题意的并输出。题目并不难,但为了不超时以及AC还是有点麻烦的。二、分析首先考虑DFS函数,如下:void DFS(int index, int tempSum, int...原创 2019-02-26 15:52:45 · 123 阅读 · 0 评论 -
PAT (Advanced Level) Practice 1025 PAT Ranking
一、概述给出N个考场,每个考场Kn个学生,求出每个学生在该考场的排名和总排名,以总排名输出,总分相同的,总排名相同,按考生号先后输出。题目不难,我选择了先存储所有数据,然后两次全部排序的方法。第一次是以考场优先的排序,第二次是以总分优先的排序。二、分析以结构体存储。第一次和第二次排序的cmp分别如下:第一次:bool cmplocal(Student a, Stu...原创 2019-02-18 03:12:27 · 151 阅读 · 0 评论 -
PAT (Advanced Level) Practice 1016 Phone Bills
一、概述题设太复杂,简而言之收话费。坑点主要有以下几个:总话费为0的话什么都不输出,就当没有这个人,我觉得这个逻辑有问题,因为题设中各小时的话费是非负数,因此可能是0,说不定电信公司善心大发呢,这样即使有有效通信话费也可能是0,但是没考虑这种情况;输出的小数位一位时要加0,因为例子给的十分好,都是10啊5啊什么的,所以对于总话费的输出容易忘了加0,或者是像我一样对100取余,这样后...原创 2019-02-18 02:03:20 · 124 阅读 · 0 评论 -
PAT (Advanced Level) Practice 1012 The Best Rank
一、概述给出N个学生的各科成绩,输出该学生的单科最好成绩。我使用了多次sort实现。坑点在于三个学生的分数若为80,80,90,则名次应该是1,2,2,而不是1,2,3.选择后者测试点1和2过不去。二、分析既然要输入最好成绩,那么便需要根据每门成绩排序一次,共排序四次。因此我使用结构存储学生的ID,各科成绩和各科排名。如下:struct Student{ char ID[...原创 2019-02-17 23:28:08 · 138 阅读 · 0 评论 -
PAT (Advanced Level) Practice 1082 Read Number in Chinese用拼音以中文方式读出数字
一、概述给出一个不超过九位的数字,用拼音将它的汉语读法写出。我觉得算是很复杂的一道题,它的复杂不在算法上的复杂,而在情况之多,极为复杂。最开始的时候,我轻视了这道题,安安分分的一位一位向后移,取余,除十判断输出,但是在写的过程中发现许多种情况都需要判断,一项一项判断会弄得很晕,不知道什么时候该如何输出。然后才发现这道题的坑爹之处。这时候我已经被什么时候输出ling什么时候输出wan什么...原创 2019-02-12 03:39:15 · 176 阅读 · 0 评论 -
PAT (Advanced Level) Practice 1062 Talent and Virtue & PAT (Basic Level) Practice 1015 德才论
一、概述给出N个考生的考生号,德成绩和才成绩,根据规则排序输出。排序题,但我一般用的只有冒泡排序。所以最开始就按最简单的模拟做法来做:开五个结构数组,输入然后判断,存入不同数组,存完之后对四个数组分别冒泡,再分别输出。先不考虑空间是否超了,只是时间复杂度就难以接受。对于最大值100000,冒泡需要的时间为一百亿的数量级,按一秒1Ghz,那么冒泡便需要一秒以上的时间,这样来说绝对会超时了,因...原创 2019-02-17 01:07:17 · 118 阅读 · 0 评论 -
PAT (Advanced Level) Practice 1077 Kuchiguse
一、概述很萌的一道题。以日语的口癖为背景,求出多个字符串的共同后缀。日语中猫叫并不是miao,而是类似nia,也就是题目中的nyan了hhhhhh。二、分析又是一道输入字符串的题,输入的思路可以与之前说反话的类似,使用while-EOF,可我不喜欢,又懒得用gets和getline。于是直接暴力一个一个输入,用回车判断是否一个字符串输入完毕。如下所示:int N;cin &...原创 2019-02-08 02:02:51 · 382 阅读 · 0 评论 -
PAT (Basic Level) Practice 1014 福尔摩斯的约会 & PAT (Advanced Level) Practice 1061 Dating
一、概述给出四段字符串s1,s2,s3,s4,按如下顺序解读:s1和s2的第 1 对相同的大写英文字母表示星期;s1和s2的第 2 对相同的字符表示小时;s3和s4的第 1 对相同的英文字母表示分钟。坑很多:首先,“第一对相同的”,保证位置相同,字符相同;然后,代表星期的字符必须限定是A~G,不能是A~Z;同理,代表小时的字符必须限定是A~N;最后,代表分钟的字...原创 2019-02-03 22:37:32 · 176 阅读 · 0 评论 -
PAT (Advanced Level) Practice 1002 A+B for Polynomials
这题目的题设就是傻逼。保留一位小数是系数保留一位小数,指数是整数,不存在小数的情况,所以不保留。系数是整数也要保留一位小数。别去想什么0.04应该化为0.0,0.05化为0.1。这个傻逼输出坑死我了。#include <stdio.h>int main(){ float A[1002] = { 0 }; float B[1002] = { 0 }; fl...原创 2018-06-07 00:04:00 · 142 阅读 · 0 评论 -
PAT (Advanced Level) Practice 1065 A+B and C (64bit)
一、概述给出三个数ABC,若A+B>C则输出true,否则输出false。坑就坑在ABC的范围,最大是2^63,long int都不行,我本来想用double的,可是double也不行,应该是double无法在数据很大的时候精确到个位吧,乖乖使用long long int。只是有一个坑,如果不是手贱是看不出的。二、分析由于A+B可能会溢出,根据操作系统学的那些玩意儿,两正数相加得...原创 2019-01-22 15:19:47 · 282 阅读 · 0 评论 -
PAT (Advanced Level) Practice 1009 Product of Polynomials 多项式相乘
一、概述输入两个多项式,输出它们的乘积。有两种思路:其一是时间复杂度较低,根据输入的多项式的系数最高为1000,那么选用长度为2000的数组存储结果可以使时间复杂度为O(n)。其二是空间复杂度较低,根据输入的项数最多为10,则输出的项数最多为100,选用长度为100的数组储存结果。但是这会造成一个问题,虽然长度为100,但是并不是按次数由高到低的顺序存储的,还需要再对结果进行排序,...原创 2019-01-27 12:53:50 · 154 阅读 · 0 评论 -
PAT (Advanced Level) Practice 1046 Shortest Distance
一、概述给出前后相连N个点,求出其中某两个点的最短距离。给的输入是相邻两点的最短距离。本题的难点在于当数量级特别大的时候,暴力算法很容易超时,应该说不是很容易,而是肯定会超时。这如果是在考场上,那这部分的分数就得扔了,一般这种超时bug都需整个算法推倒重来,时间代价很大。以我的暴力算法为例。二、分析首先说明我的暴力算法,对于前两个检查点是有效的,第三个给出超时报错。由于模型...原创 2019-01-21 16:11:49 · 160 阅读 · 0 评论