
Review
HackingGate
这个作者很懒,什么都没留下…
展开
-
PAT A1043 Is It a Binary Search Tree (25 分) 二叉搜索树
题目大意是:定义BST,其左子树都是小于父亲节点的值,右子树都是不小于父亲节点的值。以及镜像BST, 其左子树都是不小于父亲节点的值,右子树都是小于父亲节点的值。然后给出一个序列,判断是不是BST或者镜像BST的先序遍历序列。 对于这个问题,首先我看到BST就想到中序序列有序了,然后想能不能通过先序和中序序列来构造一棵树,再判断是不是BST。但很不幸,犯了一个错误,...原创 2019-08-19 22:14:29 · 98 阅读 · 0 评论 -
PAT A1007 Maximum Subsequence Sum (25 分) 最大子序列和
题目大意:计算给定序列的最大子序列和,并输出这个最大子序列的首尾元素,如果有多个最大子序列存在,输出第一个。注意,如果序列中所有的元素都是负数,那么输出0,以及整个序列的首尾元素。 使用在线处理方法计算最大子序列和,即当前和子序列和为负数时,直接置子序列和为0,并从下一个元素开始。同时还要记录子序列的首尾元素,尾元素只需要在更新最大和的时候记录即可,而当前子序列的首元素则需...原创 2019-08-24 12:42:42 · 167 阅读 · 0 评论 -
PAT A1010 Radix (25 分) 二分法 进制转换
题目大意:给出两个数N1和N2,以及其中一个数的进制radix,找到能够使N2 = N1的另一个数的进制。 首先将已知进制的数,假定为N1,换算到十进制下。然后考虑N2的进制radix2,显然radix2的下界是确定的,是N2中最大字符对应的数+1。如果用直接从下界开始往上遍历的暴力方法做的话,测试点7(1分)会超时。考虑用其它的搜索方式,也只有二分了。但是二分需要确定开始的上界...原创 2019-08-24 15:29:31 · 253 阅读 · 0 评论 -
PAT A1013 Battle Over Cities (25 分) 图连通块
题目大意:给出图的信息,如果删除指定的顶点,求对于剩余顶点,至少需要加入多少条边才能使图连通。 关键在于想到至少需要新增的边数就是当前连通块的个数 - 1。统计当前连通块的个数用 dfs方法和bfs方法都可以,与常规问题不同的是要删除指定的顶点,也就是遍历到该节点时跳过即可。AC代码:DFS:#include <iostream>#include <...原创 2019-08-25 08:39:34 · 181 阅读 · 0 评论 -
PAT A1014 Waiting in Line (30 分) 模拟
题目大意:银行有N个窗口,每个窗口最多排队M个人。假设有K个人都从8:00开始等待办理业务,并给出处理每个人业务的时间。前 N * M个人依次在N个窗口前排队,后面的人按照顺序,只有在某个窗口有空出位置时(人数小于M时),到该窗口排队。如果有多个窗口同时空出,选择序号小的。求出每个人结束业务的时间,注意如果某个人在17:00前还没有开始办理业务的话,他就不能办理业务了。 ...原创 2019-08-25 08:39:38 · 332 阅读 · 0 评论 -
PAT A1017 Queueing at Bank (25 分) 模拟
题目大意:银行有K个窗口,给出N个人的到达时间和办理业务需要的时间,银行从8:00开始营业,求出每个在17:00前到达的人的平均等待时间。每个人的业务时间不能超过1h(事实上没有测试点对应这句话)。 一开始是想把时间全部折算成从8:00开始计算的分钟的,但是这样到最后double和int很容易弄混,弄混了精度就丢失了,导致测试点5始终过不了,所以还是全部折算成从8:...原创 2019-08-25 11:03:55 · 150 阅读 · 0 评论 -
PAT A1019 General Palindromic Number (20 分) 进制转换
题目大意:判断N在base进制下的表示是否是回文数。这里,0<N<1e9,2<base<1e9。 坑点在于base可能大于十,也就是N在base下的表示每一位可能不是0~9的数,例如,1000的11进制表示,是 8 2 10。所以不能用字符串存储,而应该用vector<int>来存储N的base进制的表示。然后判断vector<int&g...原创 2019-08-25 12:35:05 · 117 阅读 · 0 评论 -
PAT A1024 Palindromic Number (25 分) 大数加法
题目大意:判断一个不超过10^10的数N,能否在K步内通过加上自身的反转数变成回文数。 与A1023 Have fun with Numbers 相同,依然是大数加法,用vector<int>存储并按照要求反转相加,判断回文即可。 坑点在于开始的输入时,N 要设置成long long型,设置成 int 型会溢出导致测试点7和8运行超时。 或者直接用...原创 2019-08-26 10:24:01 · 233 阅读 · 0 评论 -
PAT A1029 Median (25 分) 中位数 归并
题目大意:给出两个分别不超过2*10^5的升序序列,要求找出它们合并后的序列的中位数。内存限制1.5MB。 因为内存限制太小,不能同时存储两个序列,只能存储第一个序列,然后再读入第二个序列,在读入的同时进行合并操作,直到找到应当是整个序列的中位数的位置的数位置。 注意点:①若序列的长度为N,则中位数的位置是(N+1)/2,从下标为1开始计。②若第一个序列的当前位置小于正...原创 2019-08-26 16:24:57 · 146 阅读 · 0 评论 -
PAT A1031 Hello World for U (20 分) 数学问题 打印图形
题目大意:给出长度为N的字符串,输出一个U形,高度为n1(纵向第一个字符到纵向最后一个字符), 底部长度为n2, (横向第一个字符到横向最后一个字符),并且满足 n1 <= n2 和 n1 + n1 + n2 - 2 = N。 似乎是数学问题,可以从n2 = 1开始遍历(事实上也容易推出n2 >= (N + 2) / 3,不过这不重要)。要求 2 * n1 ...原创 2019-08-26 17:06:27 · 150 阅读 · 0 评论 -
PAT A1032 Sharing (25 分) 链表
题目大意:给出两个链表的头节点地址,和N个节点,判断从哪个节点开始,两个链表重合。 先用vector<int> 存储两个完整的链表,然后从两个链表的最后向前遍历,直到两个元素不相同。需要考虑的特殊情况有两个:①某个链表是另外一个链表的一部分,这样退出循环时的下标也是0。②某个链表为空,这样会造成下标越界。可以在这两个vector的开头另外分别加上一个不相同的元素,这样...原创 2019-08-26 18:16:55 · 165 阅读 · 0 评论 -
PAT A1033 To Fill or Not to Fill (25 分) 贪心 模拟
题目大意:给出N个加油站的油费以及距离出发点的距离,汽车油箱有容量上限,求出从出发点到达目的地的最少油费。如果不能到达目的地,输出最远能到达的距离。 个人觉得是相当复杂的一个模拟题,单步跟踪了好几次逻辑才写完整,考察的主要是贪心策略。要点列举如下:① 目的地也作为一个加油站,油费为0,这样能保证在查找最低油费的加油站时一定能查找到目的地。② 在当前所在的加油站往后看,在能...原创 2019-08-27 08:55:02 · 241 阅读 · 0 评论 -
PAT A1034 Head of a Gang (30 分) 图 连通块 并查集
题目大意:给出图的信息,以及每条边的边权、每个顶点的点权。寻找满足以下条件的连通块:① 顶点数大于2 ②边权之和大于给定值K。 ③选择点权最大的顶点作为该连通块的head。最后输出所有符合要求的连通块的head及连通块内的总顶点数。 与常规连通块问题有所不同的是,这里要累计边权和顶点数。如果在dfs之前首先判断该顶点是否被访问过的话,那么如果图中有环,在访问最后一个顶点时就会因为...原创 2019-08-27 08:55:08 · 268 阅读 · 0 评论 -
PAT A1038 Recover the Smallest Number (30 分) 贪心 排序
题目大意:给出N个非负的数字串,求出使得这些数字串组成的数字最小的一种排列,并输出这个最小的数。首先对所有数字串进行排序,排序的规则是如果串A + B < B + A, 那么A应当排在B的前面。要实现这个逻辑,可以直接使用STL中强大的 sort 函数。之后就是注意输出的时候开头数字非零,如果开头有0要跳过。如果全都是0,那么还是要输出0。AC代码:#include &...原创 2019-08-28 16:13:43 · 153 阅读 · 0 评论 -
PAT A1039 Course List for Student (25 分) 排序
题目大意:给出K门课程的学生信息,查找指定的N名学生的选课信息。用map对应即可,不过虽然能过,时间消耗比较大。#include <bits/stdc++.h>using namespace std;map<string, vector<int>> mp;int main(){ int N, K; cin >>...原创 2019-08-28 16:59:20 · 131 阅读 · 1 评论 -
PAT A1040 Longest Symmetric String (25 分) 暴力 动态规划
题目大意:给出一个字符串,找出它最大的对称子串的长度。 因为数据量比较少(字符串长度不超过1000),所以直接暴力做也能过,耗时不超过100ms。暴力解法的思路是:使用二重循环遍历字符串,当 str[i] == str[j]时,判断从 i 到 j 的子串是否是对称子串。因为一个字符必定是对称的,所以对称子串的最小长度是1,这一点要注意(测试点4和测试点5)。暴力代码如下:...原创 2019-08-29 09:01:22 · 319 阅读 · 0 评论 -
PAT A1044 Shopping in Mars (25 分) 二分
题目大意:给出一个正数序列,在当中找到满足这样条件的连续子串:子串的和大于等于给定值。输出具有最小的和的子串的开始和结束位置的下标(从1开始计),如果这样的子串有两个以上,按照开始位置从小到大,输出所有子串的开始和结束位置。一开始直接暴力遍历所有子串,并维护最小的子串和。但这样还是有两个测试点超时,开始位置肯定是需要遍历序列的每个元素的,那么减少耗时的主要方法就是如何查找结束位置,问题就转换为...原创 2019-08-29 10:49:38 · 374 阅读 · 0 评论 -
PAT A1045 Favorite Color Stripe (30 分) 动态规划
DFS有两个测试点超时,看来只能用动态规划做了,待补。DFS代码:#include <vector>#include <cstdio>using namespace std;void dfs(vector<int> &v, int i, vector<int> &ret, int &maxSize){ ...原创 2019-08-29 12:06:40 · 246 阅读 · 0 评论 -
PAT A1047 Student List for Course (25 分) 排序
题目大意:给出N名学生的选课信息,输出所有课程的选课人数,并按姓名首字母顺序输出名单。先存储再按姓名排序即可,耗时比较大,有优化空间。AC代码:#include <iostream>#include <vector>#include <algorithm>#include <cstdio>using namespace std...原创 2019-08-29 14:10:30 · 83 阅读 · 0 评论 -
PAT A1049 Counting Ones (30 分) 数学题
题目大意:求出从1到N的所有正整数中,数字1出现的次数。数学问题,待补。原创 2019-08-29 14:32:55 · 119 阅读 · 0 评论 -
PAT A1056 Mice and Rice (25 分) 模拟
题目大意:给出 NP个选手,编号是0~NP-1,并给出每个人的权值(老鼠的重量)。之后,按照每NG个人一组,如果最后有不足NG个人,也单独成为一组,进行比赛。每组中,权值最高的人进入下一轮,本轮未晋级的选手,全部得到同样的排名。并给出第一轮比赛的选手顺序,以0~NP-1的某种排列表示,例如,NG = 3,第一轮序列为:6 0 8 7 10 5 9 1 4 2 3含义是,第一轮比赛...原创 2019-08-30 10:35:32 · 139 阅读 · 0 评论 -
PAT A1052 Linked List Sorting (25 分) 链表
题目大意:给出N个节点和链表的头节点,要求将存在于链表上的节点按照数据域从小到大排序,形成新的链表,并输出。 静态链表问题,用数组存放原来的所有节点,用vector<Node>存放遍历过程中构成的链表,之后排序,再输出即可。注意点在于:①地址是5位,不足补零。②如果没有节点在链表上,要特判输出0 -1。AC代码:#include <vector>...原创 2019-08-30 10:36:57 · 102 阅读 · 0 评论 -
PAT A1057 Stack (30 分) 分块
题目大意:模拟栈的操作,给出三种指令,"Push x",将正数x(<10^5)压入栈中;"Pop",栈顶元素出栈;”PeekMedian",输出栈中所有元素的中位数。指令不超过10^5条。 首先,N个数的中位数应当是从小到大的第(N+1) / 2个数(从1开始计)。 寻找N个不超过10^5的正数的中位数,比较快速的方法是在压栈和出栈过程中,记录从1 ~ 10^...原创 2019-08-30 11:20:43 · 198 阅读 · 0 评论 -
PAT A1059 Prime Factors (25 分) 素数
题目大意:输出正数N的质因数分解,如果质因数的指数大于1,要按照底数^幂的形式输出。 因为要输出幂,在找质因数的同时要记录该质因数出现的次数,可以用map<int,int>,每次找到一个质因数K, 令 N /= K,开始下一次循环,直到 N <= 1为止。 坑点在于 N = 1的情况需要特判输出 1=1(测试点3)。AC代码:#include...原创 2019-08-30 11:52:50 · 431 阅读 · 0 评论 -
PAT A1060 Are They Equal (25 分) 字符串 科学计数法
题目大意:给定有效小数位数N,将不超过10^100的非负浮点数化简为 0.d[1]d[2]...d[N] * 10^k 的科学计数法形式,并判断输入的两个浮点数在这种科学计数法的形式下是否相等。 关键思想是要跳出各种细枝末节的情况,确定科学计数法的表示形式只需要确定两个值:①第一个非零数字的位置 K②小数点的位置 P。位置从下标0开始计 。 确定第一个非零数字之后,0...原创 2019-08-30 14:38:23 · 175 阅读 · 0 评论 -
PAT A1063 Set Similarity (25 分) set
题目大意:给出N个集合,输出指定集合 m 和 n 的相似度。所谓相似度,是指 集合 m 和 n 中公共的元素的个数(不重复),占 m 和 n中所有不同元素个数的百分比。 可以直接用set<int> 存储 集合 m 和 n,之后将它们的元素再插入一个新的集合中,这样可以得到它们总的不重复元素个数和公共元素个数。不过这样虽然在PAT能过,牛客网上会超时。所以需要找到时间复...原创 2019-08-31 08:30:24 · 127 阅读 · 0 评论 -
PAT A1065 A+B and C (64bit) (20 分) long double 溢出 大数加法
题目大意:给出A,B,C,范围是[-2^63,2^63)(题目右开区间写成了闭区间,非常坑,直接影响了判断),判断A + B > C是否成立。①Solution1:long long int 取值为[-2^63,2^63),如果用long long int 存储 A B C,需要考虑 A + B的溢出。具体而言,如果① A > 0, B > 0,A+B <=...原创 2019-08-31 08:30:27 · 279 阅读 · 2 评论 -
PAT A1066 Root of AVL Tree (25 分) AVL树
题目大意:给出N个节点,求出依次插入这N个节点构成的AVL树的根节点。考察AVL树的左旋右旋操作,待补。原创 2019-08-31 08:30:35 · 175 阅读 · 0 评论 -
PAT A1067 Sort with Swap(0, i) (25 分) 模拟
题目大意:给出一个0~N-1的某种排列,每次只能交换0元素和其余一个元素的位置,求出使得整个序列为升序的最少交换次数。使用vector<int> pos来存储元素 0 ~ N-1的实际位置,由于每次只能交换0元素和其余一个元素,讨论如下:① pos[0] != 0,即 0 元素不在 位置0上,那么将 0元素和值为pos[0]的元素交换,使得值为pos[0]的元素能够回到...原创 2019-08-31 08:30:43 · 123 阅读 · 0 评论 -
PAT A1068 Find More Coins (30 分) dfs+剪枝 背包问题
题目大意:从N个正数的序列中,选出一些数,使它们的和等于给定值M,要求选出的一组数是所有可能的组合中最小的。所谓组合 A < 组合B,是指当A和B都是升序排列时,满足A[0] = B[0], A[1] = B[1]......A[k-1]=B[k-1], A[k] < B[k]......。时间限制200ms,只要求输出最小的组合,直接的想法就是先按升序排序,然后从第一个元...原创 2019-08-31 09:08:10 · 253 阅读 · 0 评论 -
PAT A1071 Speech Patterns (25 分) 字符串
题目大意:找出给定的字符串中出现次数最多的单词,如果有多个,输出首字符ASCII码最小的单词。这里的单词,是指只含数字和字母字符的字符串。单词之间以非字母和数字字符分开,忽略大小写的差异。 主要考察的是循环的写法,怎么写这个循环bug能最少。用 for循环遍历思考量较少,找到一个数字或字母字符后,持续向后遍历(while),直到不是数字或字母字符,或者达到了字符串的末尾,这样就...原创 2019-08-31 11:09:39 · 237 阅读 · 0 评论 -
PAT A1075 PAT Judge (25 分) 排序
题目大意:给出N名考生的提交记录,总共有K道题,M条提交记录,要求按照总分降序、全对题目数量降序、考生id升序的方式进行排名,并输出每位考生每道题的得分。但是有一些额外要求:① 记录中得分如果是 -1,说明提交没有通过编译。② 没有任何题目通过编译的考生(也即没有得分大于-1的题目的考生),不输出。③ 输出的考生如果有题目得分是-1,应该输出0。④ 同一道题提交多次的,取最高分。⑤ ...原创 2019-09-01 09:02:27 · 246 阅读 · 0 评论 -
PAT A1076 Forwards on Weibo (30 分) 图 BFS
题目大意:给出N个微博用户,编号1~N,并给出他们每个人的关注列表。求出当编号为M的人发微博时,传播L层,有多少人能看到。 根据关注列表构建有向图,求从顶点 M 开始的 bfs 层数小于等于L的顶点数。数据没有什么坑点。因为要保证最多计数到L层,必须在 bfs 过程中记录层数。AC代码:#include <iostream>#include <vec...原创 2019-09-01 09:02:31 · 134 阅读 · 0 评论 -
PAT A1081 Rational Sum (20 分) 有理数运算
题目大意:给出N个有理数 num / den,计算它们的和并以最简带分数形式输出。有理数运算,主要有以下几个注意点:① 最大公约数的求法,辗转相除法。② 化简过程中,让分母为正数,这样在输出时可以直接输出分子,包含了符号。然后分子分母约去绝对值的最大公约数。③ 输出过程中注意分母为1的情况。AC代码:#include <iostream>#inclu...原创 2019-09-01 11:28:15 · 155 阅读 · 0 评论 -
PAT A1082 Read Number in Chinese (25 分) 字符串
题目大意:给出一个不超过九位的数,按照中文读法输出,并且注意"0"的读法,比如,10100,要读成 "yi Wan ling yi Bai"。 非常繁琐的一道题,主要的问题在于”0“的读法,处理这一问题的策略是,按照从高位到低位,顺序读入每个数。设置一个变量表明是否应当输出"ling"。如果当前读到了非零数字,而且与前一个非零数字中间有0的话,除了一种情况外,都应该输出”ling...原创 2019-09-02 10:46:20 · 189 阅读 · 0 评论 -
PAT A1085 Perfect Sequence (25 分) upper_bound 二分
题目大意:给出一个N个数的序列,从中选出一些数,满足以下条件:选出的数中的最大值M <= 最小值m * p,p是给定值。求出最多能选出多少个数。 思路比较直白,先排序,然后依次遍历,显然遍历到的数作为最小值,然后找到满足 <= m * p的元素的最大下标,之后就可以求出以当前元素为最小值的可能序列长度。找最大元素下标可以用二分法手动实现,不过要注意返回的是最后一个 &...原创 2019-09-02 14:48:00 · 114 阅读 · 0 评论 -
PAT A1088 Rational Arithmetic (20 分) 有理数
题目大意:给出两个有理数,输出它们四则运算的结果,以最简带分数表示,分母为0的输出Inf。 与PAT A1081 Rational Sum类似,只是这里要求更多,需要进行四则运算。运算过程没有什么难度,有一个坑点是,尽管题目声明最终输出的数不会超过 long int 也就是 int 的范围,但是在运算过程中用 int 型可能会溢出,测试点2和3的浮点错误就是来源于此。所以有理数要...原创 2019-09-02 17:14:22 · 372 阅读 · 0 评论 -
PAT A1093 Count PAT's (25 分) 数学问题
题目大意:给出一串只由 'P' 'A' 'T'三种字符组成的字符串,计算可以组成多少个''PAT''。 如果'A'的左边有M个 'P' , 右边有N个 'T' ,那么就能组成 M * N 个 ''PAT'' 。所以这题实际上是要遍历两次字符串,第一次遍历从左向右遍历得到每个位置上对应的在左边的'P'的个数,第二次从右向左遍历得到每个位置上对应的在右边的'T'的个数,如果遍历到'A...原创 2019-09-03 08:57:17 · 137 阅读 · 0 评论 -
PAT A1095 Cars on Campus (30 分) 模拟 排序
题目大意:统计校园内某一时刻的车辆数。给出N条记录,每条记录包括 车牌、记录时间 和 状态(in/out)。然后给出K个时刻,查询每个时刻的总车辆数,这K个时刻是按照时间递增顺序给出的。与PAT A1016 Phone Bills相同,对于同一辆车而言,只有在时间上相邻且状态不同的两条记录被认为是有效的。与PAT A1016不同的是,本题数据量非常大,需要仔细优化。...原创 2019-09-03 08:57:26 · 205 阅读 · 0 评论 -
PAT A1096 Consecutive Factors (20 分) 数学问题
题目大意:找出N的所有连续因子中,第一个长度最长的连续因子串。例如,630 = 3* 5 * 6 * 7,应当输出5 * 6 * 7。 总体思路是,从 2 到 sqrt(N)进行遍历,如果遍历到 N 的因子,那么将它作为起点,持续向后累加,直到不是N的因子为止,记录这个因子串的长度,如果是最大的,那么就更新最长因子串的起点记录。 坑点是如果是质数,应当输出它本身。而s...原创 2019-09-03 08:57:31 · 344 阅读 · 0 评论