PAT
SeasonJoe
这个作者很懒,什么都没留下…
展开
-
堆排序的两种调整
记录一下堆的两种调整//小根堆的两种调整#include<iostream>#include<algorithm>#include<vector>#include<cstdio>using namespace std;void adjustUp(int a[],int i){//只能排序a[1,n],插入时使用 if(i=...原创 2018-09-07 10:24:09 · 872 阅读 · 0 评论 -
PAT1103 Integer Factorization (30)(DFS:回溯)
题意:给三个正整数N、K、P,将N表示成K个正整数(可以相同,递减排列)的P次方和,如果有多种方案,选择底数n1+…+nk最大的方案,如果还有多种方案,选择底数序列的字典序最大的方案思路:这题看时间和n的大小就知道估计是用dfs做,不过我回溯烂的很,没写出来,下面是参考别人代码写的。注意codeblock中pow返回时会损失精度,pow(5,2)如果用int显示为24,解决方法是+...原创 2018-07-12 20:33:46 · 320 阅读 · 0 评论 -
PAT1096 Consecutive Factors (20)(逻辑)
题意:一个正整数N的因子中可能存在若干连续的数字。例如630可以分解为3*5*6*7,其中5、6、7就是3个连续的数字。给定任一正整数N,要求编写程序求出最长连续因子的个数,并输出最小的连续因子序列。思路:这题没想出来。基本思路是n最多为12个连续的数相乘,这样就从len=12到1倒序遍历,再从i开始连续乘len个数,如果积等于n就输出,注意最后要输出素数的情况。#include<iostr...原创 2018-07-05 22:45:56 · 271 阅读 · 0 评论 -
1108 Finding Average (20)(字符串)
题意:求一系列输入的平均值,其中有的输入不合法思路:这题本身就判断一下就行,主要是记录一下sscanf和sprintf的用法:sscanf() – 从一个字符串中读进与指定格式相符的数据sprintf() – 字符串格式化命令,主要功能是把格式化的数据写入某个字符串中。注意sscanf()要提取值必须完全与格式匹配,所以abc11.654这种格式是不行的,只能是11.454...原创 2018-07-23 23:11:48 · 282 阅读 · 1 评论 -
PAT1145 Hashing - Average Search Time(hash—平方探测法)
题意:给定一个序列,用平方探测法解决哈希冲突,然后给出m个数字,如果这个数字不能够被插入就输出”X cannot be inserted.”,然后输出这m个数字的平均查找时间思路:抽空整套做了一下寒假最新的这套题,感觉还行,大概一个半小时能写完,但是这题就卡住了,前面也出现过这种问题,主要问题在于我数据结构里学的平方探测法定义就不一样,PAT里递推公式为Hi=(key+di)%m,其中...原创 2018-07-04 17:05:21 · 763 阅读 · 0 评论 -
PAT1101 Quick Sort (25)(逻辑)
题意:快速排序中,我们通常采用某种方法取一个元素作为主元,通过交换,把比主元小的元素放到它的左边,比主元大的元素放到它的右边。 给定划分后的N个互不相同的正整数的排列,请问有多少个元素可能是划分前选取的主元?例如给定N = 5, 排列是1、3、2、4、5。则:1的左边没有元素,右边的元素都比它大,所以它可能是主元;尽管3的左边元素都比它小,但是它右边的2它小,所以它不能是主元;尽管2的右边元素都...原创 2018-07-10 20:53:15 · 218 阅读 · 0 评论 -
PAT1104 Sum of Number Segments (20)(数学)
题意:给出一个序列的数,要求输出所有连续子集的总和思路:这题就是纯粹的数学题,想不到就gg,题意还不明确,给出的序列指的是已经排好序的。基本思路是统计每个数所出现的次数,以该点的位置i,向左有i-1个排序子集,向右有(n-i)个排序子集,左边不能全不用,所以有i种,右边可以全不用也就是到第i个数为止,所以有(n-i+1)种,因此第i个数出现i*(n-i+1)次。#include&...原创 2018-07-16 21:59:55 · 255 阅读 · 0 评论 -
PAT1095 Cars on Campus (30)(模拟)
题意:给出n个车牌号、时间点、进出状态的记录,然后查询k个时间点这时校园内的车辆个数。最后还要输出在校园里面呆的时间最长的车的车牌号,以及呆了多久的时间。如果有多辆车就按照它的字母从小到大输出车牌。配对要求是,如果一个车多次进入未出,取最后一个值;如果一个车多次out未进入,取第一个值。注意:一个车可能出入校园好多次,停车的时间应该取之和。思路:这个模拟题还蛮难的,主要是不符合要求的情况不好处理。...原创 2018-07-03 11:06:54 · 252 阅读 · 0 评论 -
PAT1093 Count PAT's (25)(逻辑题)
题意:给出一个包含'P','A,'T''三种字符的字符串,问能找到几个PAT子串思路:这题是个逻辑题,想到了就很简单,可惜我没想到。基本思路就是找A,A左边的P个数*A右边的T个数累加即可。#include<algorithm>#include<iostream>#include<cmath>#include<queue>#include&l...原创 2018-07-01 10:12:20 · 214 阅读 · 0 评论 -
PAT1087 All Roads Lead to Rome (30)(最短路径+dfs+回溯)
题意:有N个城市,M条无向边,从某个给定的起始城市出发,前往名为ROM的城市。每个城市(除了起始城市)都有一个点权(称为幸福值),和边权(每条边所需的花费)。求从起点到ROM所需要的最少花费,并输出其路径。如果路径有多条,给出幸福值最大的那条。如果仍然不唯一,选择路径上的城市平均幸福值最大的那条路径。思路:这种题,如果简单一点,要求没那么多的情况,可以直接在dijkstra中写用dp的...原创 2018-06-19 10:27:14 · 299 阅读 · 0 评论 -
PAT1086 Tree Traversals Again (25)(树的遍历)
题意:用栈的形式给出一棵树建立的顺序,要求输出后序遍历思路:push的顺序就是先序遍历,pop出的顺序就是中序遍历,所以直接用二叉树先序和中序遍历转后序即可。主要记录一下模板#include<bits/stdc++.h>#define inf 0x3f3f3f3fusing namespace std;const int maxn = 10000;vector...原创 2018-06-18 10:14:08 · 178 阅读 · 0 评论 -
PAT1143 Lowest Common Ancestor(BST)
题意:给出一棵二叉搜索树的前序遍历,问结点u和v的共同最低祖先是谁思路:这题我一开始的思路是建树,顺便建立前驱关系,然后就写,写完超时两个案例。正确思路是如果当前结点值在[u,v]之间,就说明该点为最低公共祖先,这个地方没想到,下面是别人的代码,非常简单,都不用建树。#include<iostream>#include<algorithm>#include<vec...原创 2018-07-14 23:16:36 · 314 阅读 · 0 评论 -
1110 Complete Binary Tree(完全二叉树)
题意:给出一个n表示有n个结点,这n个结点为0~n-1,给出这n个结点的左右孩子,求问这棵树是不是完全二叉树思路:这题就是先建树,找出根结点然后层序遍历,我一开始是把每层的结点数存储下来看是否等于2^i,结果有两个案例没过,看别人的代码有更好的方法,就是记录遍历的个数cnt,如果遇到空结点并且(cnt==n)那就是完全二叉树,如果(cnt!=n)那就不是完全二叉树。注意会存在一开始cn...原创 2018-07-26 13:06:00 · 345 阅读 · 0 评论 -
PAT1135 Is It A Red-Black Tree(红黑树)
题意:给出一棵平衡二叉搜索树的先序序列,要求判断是否为红黑树思路:这题一开始我没意识到红黑树都是平衡二叉搜索树,知道后就先按照先序和中序建树,然后按照红黑树的定义,用递归判断每个节点的左右黑节点的个数即可#include <bits/stdc++.h>using namespace std;const int maxn=50;int pre[maxn],in[m...原创 2018-08-03 22:01:52 · 304 阅读 · 0 评论 -
L2-014 列车调度(队列模拟:set)
题意:两端分别是一条入口(Entrance)轨道和一条出口(Exit)轨道,它们之间有N条平行的轨道。每趟列车从入口可以选择任意一条轨道进入,最后从出口离开。在图中有9趟列车,在入口处按照{8,4,2,5,3,9,1,6,7}的顺序排队等待进入。如果要求它们必须按序号递减的顺序从出口离开,则至少需要多少条平行铁轨用于调度?思路:这题如果直接用队列模拟会内存超限并超时,没有必要存储每个队...原创 2018-09-06 22:04:13 · 530 阅读 · 0 评论 -
L3-015 球队“食物链”(dfs)
题意:某国的足球联赛中有N支参赛球队,编号从1至N。联赛采用主客场双循环赛制,参赛球队两两之间在双方主场各赛一场。联赛战罢,结果已经尘埃落定。此时,联赛主席突发奇想,希望从中找出一条包含所有球队的“食物链”,来说明联赛的精彩程度。“食物链”为一个1至N的排列{ T1 T2 ⋯ TN },满足:球队T1战胜过球队T2,球队T2战胜过球队T3,⋯,球队...原创 2018-09-06 18:00:57 · 422 阅读 · 0 评论 -
PAT1085 Perfect Sequence(二分)
题意:从n个数中选择若干个数,要求这些数中的最大值不超过最小值的p倍。要求选出的数的最大个数。思路:这题就是一个二分查找问题,先排序,然后二分查找第一个大于最小值p倍的数的位置。注意a[i]*p可能达到10^18,所有要用long long型。#include<bits/stdc++.h>using namespace std;const int maxn=1e5...原创 2018-09-05 15:33:03 · 214 阅读 · 0 评论 -
PAT1123 Is It a Complete AVL Tree(AVL树&&完全二叉树)
题意:给出一系列数,要求组成AVL树,最后层序输出,并且判断是否为一个完全二叉树要点:这题就是一个AVL树的插入和判断完全二叉树,之前分别都有出现过,AVL树的建立需要记忆。#include<bits/stdc++.h>using namespace std;int cnt=0,n;bool flag,vis;vector<int> ans;s...原创 2018-08-25 17:03:55 · 310 阅读 · 0 评论 -
PAT1130 Infix Expression(树的递归)
题意:给出一棵符号树,要求加上括号输出正确的序列思路:这题一开始没想出来,不知道括号该怎么插入,实际上只要根节点和叶子节点不插入括号,其他的按中序正常插入即可。#include<bits/stdc++.h>using namespace std;struct node{ string key; int left,right;}tree[30];...原创 2018-08-29 18:27:45 · 231 阅读 · 0 评论 -
PAT1105 Spiral Matrix(模拟)
题意:给出一系列数,要求从大到小螺旋式排列成一个矩阵思路:这题看到了一种很好的办法,记录一下,可以先设立一个mapp[m][n]的矩阵并全赋值为-1,这样螺旋时遇到之前插入的值就会停止,这样就可以按行列插入数组。#include<bits/stdc++.h>using namespace std;const int maxn = 10050;int row[ma...原创 2018-08-27 16:28:17 · 239 阅读 · 0 评论 -
PAT1131 Subway Map(DFS&&回溯)
题意:找出一条路线,使得对任何给定的起点和终点,可以找出中途经停站最少的路线;如果经停站一样多,则取需要换乘线路次数最少的路线思路:这题就是用dfs+回溯写,我回溯写错了,找到终点的地方回溯了一次,递归回去又回溯了一次,这样就回溯了两次,看别人代码写了一下,这题还有一个地方要注意的就是这个换乘线路,我一开始是很随意的看该点有几条分支,超过2条说明为节点,但实际上这题求的是换乘的次数,完...原创 2018-08-08 20:04:46 · 385 阅读 · 0 评论 -
PAT1119 Pre- and Post-order Traversals(先序后序求中序)
题意:给出先序和后序,要求如果能形成唯一的树就输出yes和中序,如果不能就输出no和任意一个中序思路:这题就是递归建树,根据后序中倒数第二个数到先序中寻找对应的位置,如果后序的倒数第二个数和先序的第二个数相同就说明不唯一,此时选择将其作为右子树。我这题写的时候考虑复杂了,想着同时用先序的第二个数和后序的倒数第二个数去拆分树,实际上只要选择其中一个就行,然后递归的时候如果不唯一,只有一个...原创 2018-08-15 20:21:31 · 315 阅读 · 0 评论 -
PAT1129 Recommendation System(set&&运算符重载)
题意:根据用户每次点击的东西的编号,输出他在点当前编号之前应该给这个用户推荐的商品的编号,只推荐k个,也就是输出用户曾经点击过的商品编号的最多的前k个,如果恰好两个商品有相同的点击次数,就输出编号较小的那个思路:这题我一开始看就觉得快排肯定要超时,就用选择排序写,结果还是超时,这种每次变化不多并且对时间复杂度要求比较高的就是应该用set这种自排序的容器,重载一下运算符<即可,注意...原创 2018-08-07 23:07:53 · 443 阅读 · 0 评论 -
PAT1139 First Contact(模拟)
题意:A和B告白,必须通过A的同性朋友和B的同性朋友传达,要求输出所以可能的两个朋友的情况思路:这题有些复杂,我一开始想复杂了,上来就用dfs+回溯做,结果超时,其实只要遍历所有A的朋友和B的朋友,看这两者是否互为朋友即可。不过这题还有很多地方要注意,我还是看别人的代码写的。https://www.liuchuo.net/archives/4210#include<io...原创 2018-07-22 22:57:17 · 374 阅读 · 0 评论 -
PAT1078 Hashing (25)(hash:二次探测法)
题意:给出散列表长和要插入的元素,将这些元素按照读入的顺序插入散列表中,其中散列函数为h(key) = key % TSize,解决冲突采用只向正向增加的二次方探查法。如果题中给出的TSize不是素数,就取第一个比TSize大的素数作为TSize思路:这题就是考察一个hash中的处理冲突中的平方探测法,一堆坑: 平方探测法属于开放定址法中的一种,数学递推公式为Hi=(H(key...原创 2018-06-10 10:46:13 · 448 阅读 · 0 评论 -
PAT1068 Find More Coins (30)(DP)
题意:给出n枚钱币,要求买价值为m的物品,要求输出具体所用的钱币,如有多种情况输出字典序最小的情况。思路:这题就是01背包的变种,状态转移方程很好写:dp[i][j]=max(dp[i-1][j],dp[i-1][j-c[i]]+c[i])主要难点在于怎么处理多种情况最后输出,基本思路是一开始将钱币按从大到小排序,在状态转移的过程中用hash[i][j]保存是否选取了当前钱币i,这样最后对dp[n...原创 2018-05-31 14:41:51 · 214 阅读 · 0 评论 -
PAT1022 Digital Library (30)(map的使用)
很简单的题,就是考察一个map的使用,不过这题有个陷阱就是最后输出的id必须是7位的,我做这题的时候用到了string的分割,其实不需要,直接用getchar()就可以判断结束条件,注意使用getline时要吃掉\n#include<string>#include<cstdlib>#include<vector>#include<stack&g...原创 2018-04-06 20:54:27 · 199 阅读 · 0 评论 -
PAT1020 Tree Traversals (25)(中序后序遍历生成树)
题目很简单,就是给出树的中序和后序遍历,要求输出层序遍历,记录一下主要是因为之前这块一直懒得写,一直没写过#include<bits/stdc++.h>#define INF 0x6ffffusing namespace std;struct node { int data; node *left, *right;};int n;int postOrder[35...原创 2018-04-05 22:39:03 · 222 阅读 · 0 评论 -
PAT1038 Recover the Smallest Number (30)(贪心)
题意:给出一些字符串,把他们拼接起来获得最小数字要点:就是贪心,比较字符串大小,如果其中一个是另一个的子串就比较一下它和另一个除去相同子串剩下的部分即可。我一开始想复杂了,一直在考虑前导0的问题,觉得如果前导0放在中间可能会更小,但其实是不可能的,因为放在前面总位数变少了,所以压根不用考虑这么复杂,直接排序一下最后处理一下就完事了。不过网上的代码想法非常巧妙,下面贴一下。#include<i...原创 2018-04-22 20:04:05 · 172 阅读 · 0 评论 -
PAT1021 Deepest Root (25)(树的最深节点)
题意:给出n-1条边,要求判断能否生成一棵树,并求树中所有以它为根时深度最大的节点。思路:我一开始做的时候就很莽的直接用dfs搜索,就有一个节点超时,其实简单的思考就是如果以1为根,那么就是当前最深的几个点,他们之间的距离也就是树最大的深度。可以这么理解:从1到i距离最远,那么以i为根,到1的距离已经是最远,那只要从1开始找次深的点即可。实现方法就是先dfs一遍找出最深的几个点,在用其中一个再次d...原创 2018-04-05 22:49:31 · 345 阅读 · 0 评论 -
PAT1033 To Fill or Not to Fill (25)(贪心)
题意:开车从起点出发,到终点的路上有一些加油站,不同的加油站油价不同,要求输出到终点时最少花费的钱思路:贪心,在加满油可以走的最大距离内分情况讨论:在范围内存在加油站油价比当前加油站小,就加油加到刚好可以到那个加油站在范围内不存在加油站油价比当前加油站小,说明当前加油站油价最小,所以在当前加油站加满油再走到不包括当前加油站的油价最小的加油站,也就是油价第二小的,此时会剩下一些油。自己写的时候基本想...原创 2018-04-17 20:19:00 · 185 阅读 · 0 评论 -
PAT1026 Table Tennis (30)(排队模拟)
又是排队模拟,PAT很喜欢出排队模拟题,这题巨复杂,反正我是没想出来,基本的思路就是分为桌子为VIP和选手为VIP一共4种情况讨论,太复杂。抄了一下别人的代码,其中的几个难点写了注释。#include<iostream>#include<vector>#include<string>#include<algorithm>#define INF...原创 2018-04-11 19:31:05 · 279 阅读 · 1 评论 -
PAT1018 Public Bike Management (30)(最短路径+DFS)
题意:每个自行车车站的最大容量为一个偶数cmax,如果一个车站里面自行车的数量恰好为cmax / 2,那么称处于完美状态。如果一个车展容量是满的或者空的,控制中心(处于结点0处)就会携带或者从路上手机一定数量的自行车前往该车站,一路上会让所有的车展沿途都达到完美。现在给出cmax,车站的数量n,问题车站sp,m条边,还有距离,求最短路径。如果最短路径有多个,求能带的最少的自行车数目的那条。如果还是...原创 2018-04-02 21:59:14 · 201 阅读 · 0 评论 -
PAT1010 Radix (25)(模拟)
这题的题意极难懂,给两个数a,b和a的进制x,问b在哪个进制下和x进制的a相等,一开始我以为就是简单的最高进制单字符为z=36就行了,后来发现不对,这题的基数可以非常大,比如999999 1 1 10这种情况,b的基数就可以取999999,可以看出基数最大的可能也就是a的十进制表示,还要注意用long long,而且求a的十进制表示时还有可能溢出,所以最后二分的时候还要讨论一下,总之坑太多了。还有...原创 2018-03-25 22:51:52 · 256 阅读 · 0 评论 -
PAT1014 Waiting in Line (30)(模拟)
这题思路倒是不难,比较容易想到是用queue进行模拟,主要是要想到对每个队列维护一个当前顾客进入的时间,我的模拟不咋样啊,这种题就感觉难度不小了。#include<string>#include<cstdlib>#include<vector>#include<stack>#include<queue>#include&l...原创 2018-03-29 19:37:46 · 204 阅读 · 0 评论 -
PAT1007 Maximum Subsequence Sum (25)(最大连续和)
这题没什么好说的就是一个最大连续和的裸题,只要掌握dp[i]=max(dp[i-1],0)+num[i]即可,记录一下主要是因为我自己写的时候边界条件没处理好,也就是dp[i-1]这里对于0的处理,所以尽量少用dp[i-1]这种形式,用一个变量存就可以了。/*自己写的不太好*/#include<string>#include<cstdlib>#include<v...原创 2018-03-22 19:32:08 · 155 阅读 · 0 评论 -
PAT1039 Course List for Student (25)(hash)
这题一点都不难,但是会有一个点超时,我原本是用map直接写,最后一个点超时,这是因为处理字符串类型的速度是相当慢的,这题学生姓名非常规则,所以hash一下转化为数字速度就会快很多。记录一下这种情况。#include<iostream>#include<string>#include<vector>#include<map>#include&l...原创 2018-04-23 09:00:36 · 332 阅读 · 1 评论 -
PAT1034 Head of a Gang (30)(并查集)
题意:给出n次通话记录,当通话的人数超过2人并且通话总时长超过k时,这些人就是犯罪团伙,其中通话时间最大的人是头目,要求按字母序输出头目和团伙人数思路:就是并查集,将两两通话的人关联在一起,因为通话的人的姓名是按三位字母给出的,所以要离散化,并且对应要用一些STL保存映射。我自己写的时候有两个点没过,后来改过了,错误原因写在下面注释里了。网上的代码也有用DFS找连通分量做的。#i...原创 2018-04-18 22:32:18 · 284 阅读 · 0 评论 -
PAT1040. Longest Symmetric String (25)(回文串:dp)
题意:给出一个字符串,求出其中最大的回文串字数要点:这题比较好的办法是用dp做:dp[i][j]表示从s[i]到s[j]是否为回文串,用0、1区分s[i]=s[j]时,dp[i][j]=dp[i+1][j-1];s[i]!=s[j]时,dp[i][j]=0边界:dp[i][i]=1,dp[i][i+1]=(s[i]==s[i+1])?1:0因为i、j如果从小到大的顺序来枚举的话,无法保证更新dp[...原创 2018-04-24 22:01:02 · 216 阅读 · 0 评论 -
PAT1081 Rational Sum(gcd)
题意:给出一些分数,要求以分数的形式输出它们的和思路:这题就是分别对分子和分母进行处理,中间有个点过不去因为分母过大超过范围,所以中间处理的时候要求出最大公约数,顺便我辗转相除法也忘了,复习一下。#include<bits/stdc++.h>#define inf 0x3f3f3f3fusing namespace std;const int maxn = 15...原创 2018-06-13 18:41:42 · 259 阅读 · 0 评论