
PAT甲级题解
PAT甲级的刷题记录
坤斤拷
握り信じたうたかたの影を
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
PAT甲级1145 Hashing - Average Search Time (25point(s))
又是坑人的一题。必须要在哈希表中查找 tSize+1 次还没找到才能停止,我觉得不太对啊,第 tSize+1 次查找,(x + tSize*tSize) % tSize 不是显而易见地是跟第一次查找是一毛一样的位置吗???为什么还要没事找事再找一遍???反正我不理解。。#include <bits/stdc++.h>using namespace std;const int maxn = 1e4+1e2;int tSize, n, m;int hashTable[maxn];in原创 2020-09-03 16:25:28 · 375 阅读 · 2 评论 -
PAT甲级1147 Heaps (30point(s))
比较水的题目。#include <bits/stdc++.h>using namespace std;const int maxn = 1e3+3;int m, n;int tree[maxn];int heap;vector<int> ans;void read() { for (int i = 1; i <= n; ++i) { scanf("%d", &tree[i]); }}// 判断堆的类型voi.原创 2020-08-26 11:35:14 · 346 阅读 · 0 评论 -
PAT甲级1143 Lowest Common Ancestor (30point(s))
这题比 1151 简单一点,因为给出的是 BST,它的中序遍历是非减的,从而在判断两结点是否在当前根结点的两侧时,可以直接比较大小来判断。比较坑的是,必须要先找到合适的范围,然后输出答案,而不能边遍历(或递归)边判断是否该输出,会有个点超时。我真的想不明白就这一组 If else 判断居然能超时。#include <bits/stdc++.h>#define INF 0x3f3f3f3fusing namespace std;const int maxn = 1e4+4;in.原创 2020-08-26 10:58:33 · 293 阅读 · 0 评论 -
PAT甲级1151 LCA in a Binary Tree (30point(s))
求 LCA,当然,不用真写个 LCA 算法出来(tarjan 什么的)。题目给了树的中序遍历和先序遍历,我们不需要先把树建起来,而是可以在建树的过程中,找出两个结点的 LCA。具体的想法是,当两个结点不同时,它们必分布在它们的 LCA 的两侧,结合给出的中序遍历,分布在两侧的结点在中序遍历中相对根结点(即 LCA)的位置也正好是一前一后。根据这个性质,我们就可以按照建树的方法,先在前序遍历中找根,然后在中序遍历中把两棵子树找出来,看看两个结点是否分布在两棵不同的子树上。反复查找直到找到满足的情况,第一.原创 2020-08-25 12:49:52 · 235 阅读 · 0 评论 -
PAT甲级1155 Heap Paths (30point(s))
这题了解完全二叉树的数组存储方法就能写,也就是,若数组开始于 1,每个点 i 的左儿子的下标为 2*i,右儿子的下标为 2*i+1。根据这个递归即可,具体看注释。#include <bits/stdc++.h>using namespace std;const int maxn = 1e3+3;int n;int tree[maxn];int heap;vector<int> path;void read() { cin >> n; .原创 2020-08-25 12:34:54 · 228 阅读 · 0 评论 -
PAT甲级1017 Queueing at Bank
姥姥的银行又开业了。跟 1014 相比,简单了不少,只需要找到最早可用的窗口即可。但我还是卡了半天,读题不认真。。。PAT真就考读题。我卡了半天的点是,17:00 (含)前到的客户,无论多晚,银行都奉陪到底,这是我意想不到的。。。#include <bits/stdc++.h>#define INF 0x3f3f3f3fusing namespace std;const int maxn = 1e4+4;const int maxk = 1e2+2;const int max原创 2020-08-09 15:30:11 · 172 阅读 · 0 评论 -
PAT甲级1016 Phone Bills
大模拟。关键点在于:排序。各个 record 的顺序和各个客户的 bill 的顺序,需要处理,都可以通过 string 的 < 来比较。前者可以用 sort;后者可以通过遍历set,或者把客户的名字记录在一个数组里,然后 sort,最后遍历数组,也是可以的。 配对。在把 record 按时间排序后,遍历 record 数组,找出一前一后分别是 on-line 和 off-line 的 record 对。对于一前一后是 on-on、off-off、off-on 的,直接忽略。 账单抬头、总额的.原创 2020-08-09 13:45:20 · 237 阅读 · 0 评论 -
PAT甲级1015 Reversible Primes
素数判断+进制转换。由于有多个 case,素数判断可以写个筛法。进制转换前面几题也有出现过,不多说了。翻转字符串,对于 char[],可以用 strrev(s);对于 string,可以用 reverse(s.begin(), s.end())。当然,自己写也 ok。#include <bits/stdc++.h>using namespace std;const int maxn = 1e5+5;int n, d;int primeList[maxn], cnt;boo原创 2020-08-08 13:06:50 · 204 阅读 · 0 评论 -
PAT甲级1014 Waiting in Line
模拟题。感觉跟某次 CSP 的第四题有点像,是它的简化版。维护 n 个队列,长度均 <= m,每个队列记录其下一个客户可以开始的时间(或者称为当前正在处理的客户的完成时间)。每次遍历所有队列,找出完成时间最早的那个,更新相应的客户的完成时间,并将其移除出该队列。同时,若还有客户在黄线以外,则将其加入该队列(这样就能保证 <= m 了)。反复执行,直到遍历所有队列后发现,所有队列的最早完成时间都在 17:00 之后了,这时,坑来了。即使银行 17:00 关门,但仍要等待 17:00 前就开始的原创 2020-08-08 13:06:18 · 262 阅读 · 0 评论 -
PAT甲级1013 Battle Over Cities
题意,给定 n 个点,由 m 条无向边连接。现在,指定一个点删除,同时删除该点的邻边。问,余下的点最少要补多少条边才能够连通。既然是连通性问题,就上并查集吧。先把边存下来(因为有 k 个 case),对于每个 case,遍历边集,将未被删除的边的两端加入并查集。遍历完成后,检查该并查集有多少个根(也就有多少个连通块)。由于用一条边就可将两个点连接起来,所以需要的边的数量是根数-1。我用的 cin,第一发第五个点 t 了,关了同步后 ac。另外,本题还可以用 dfs/bfs 做,就不写了。总之,思原创 2020-08-07 21:11:44 · 728 阅读 · 0 评论 -
PAT甲级1012 The Best Rank
重复代码很多的一道模拟题,感觉写得不够好。坑点就是,可能会忘记分数相等时,排名是并列的,取高。#include <bits/stdc++.h>using namespace std;const int maxn = 2e3+3;const double EPS = 1e-6;char course[4] = {'A', 'C', 'M', 'E'};struct Student { string id; double mark[4]; int best原创 2020-08-07 11:31:46 · 202 阅读 · 0 评论 -
PAT甲级1011 World Cup Betting
模拟题。#include <bits/stdc++.h>using namespace std;const double EPS = 1e-6;char c[3] = {'W', 'T', 'L'};char buy[3];double ans = 0.65;void read() { for (int i = 0; i < 3; ++i) { double maxo = 0.0; double odd; for原创 2020-08-07 10:41:03 · 228 阅读 · 0 评论 -
PAT甲级1010 Radix
思路很简单,把两个数分别转为 10 进制,然后进行比较。主要有几个坑:radix 可能会很大(在题目中没有说明),要用 long long(经测试,能装下 tag 指定的数) 要用二分搜索答案,否则会超时 二分的初始上下界为 tag 指定的数值+1+1(一个+1是因为左闭右开,另一个是因为可能会有 a 10 2 10 这样的样例)和 另一个数的最大位数+1(显然) 若二分时 mid 过大,可能会导致结果为负数,要将这个可能加入判断中#include <bits/stdc++.h&g.原创 2020-08-06 23:23:33 · 237 阅读 · 0 评论 -
PAT甲级1009 Product of Polynomials
O(n2) 暴力模拟。两个多项式相乘,也就 1e6,可以水过。当然,也可以选择写个链表,麻烦了些。#include <bits/stdc++.h>using namespace std;const int maxn = 1e3+1;const int maxm = 2e3+2;const double EPS = 1e-6;int k;double t[maxn];double ans[maxm];int main() { int n; double原创 2020-08-06 21:39:16 · 195 阅读 · 0 评论 -
PAT甲级1008 Elevator
我湖考试原题。太水了。#include <bits/stdc++.h>#define ll long long#define INF 0x3f3f3f3fusing namespace std;void solve(){ int n, f, p = 0, ans = 0; cin >> n; for(int i = 0; i <...原创 2019-02-13 19:59:33 · 164 阅读 · 0 评论 -
PAT甲级1007 Maximum Subsequence Sum
最大子段和,可以O(n)实现。跟HDOJ1003几乎一样,但细节上有些不同。一定要注意的是,序列全部为负才输出头尾的值,如果出现了-3 -2 -1 0这样的序列,是要输出0 0 0的。#include <bits/stdc++.h>#define ll long long#define INF 0x3f3f3f3fusing namespace std;const ...原创 2019-02-13 19:51:14 · 207 阅读 · 0 评论 -
PAT甲级1006 Sign In and Sign Out(排序)
简单的排序题。对登录与登出时间分别做一次排序,分别输出最小、最大值就好了。吐槽一下题目没给m的数据范围。由于登录登出时间都是格式化了的,且并不会有两个记录的登录或登出的时间是相等的情况,所以可以用string来存储,并直接利用> 、<来比较大小(不经意间就卖了个萌?)。而把登录登出时间转换为秒来比较大小也完全可以,只是有些麻烦了。#include <bits/stdc+...原创 2019-02-12 14:12:46 · 237 阅读 · 0 评论 -
PAT甲级1005 Spell It Right
简单的操作题,不要忘了sum为0的情况。#include <bits/stdc++.h>#define ll long long#define INF 0x3f3f3f3fusing namespace std;int sum;string num2word[] = {"zero", "one", "two", "three", "four", "five原创 2019-02-12 13:59:03 · 149 阅读 · 0 评论 -
PAT甲级1004 Counting Leaves(DFS / BFS)
传送门:1004 Counting Leaves题意:对于一棵树,给定树的结点个数n(<100)与内部节点(非叶子结点)个数m(<n),以及m个内部结点的孩子结点,以内部节点的id,内部节点id的孩子数量k,内部节点id的k个孩子的输入形式给出。特别的,01总是树的根节点。要求的是,每一层的叶子结点的数量。思路:先构造出给定的树,然后从根结点开始遍历,记录叶子结点的深度,遍历完成后,每一层...原创 2019-02-12 13:32:31 · 209 阅读 · 0 评论 -
PAT甲级1003 Emergency(最短路)
题意是给定n个城市m条道路,每个城市有权重p,求城市c1到c2最短路径的条数,以及最短路径经过城市的权重和的最大值。既然要求最短路,就祭上了dijkstra,只不过需要对算法做一定的修改,需要在更新最短路时,同时更新最短路条数与最大权重。具体的更新策略如下(u为当前道路的起点,v为当前道路的终点):①当dis[v.x] > dis[u.x]+v.d时更新最短路dis[v.x] =...原创 2019-02-10 14:54:57 · 415 阅读 · 0 评论 -
PAT甲级1002 A+B for Polynomials
我湖数据结构实验原题既视感...给出数据已按指数降序排好,就不用写排序的函数了,但要特别注意一下系数相加为0时的情况。#include <bits/stdc++.h>#define ll long long#define INF 0x3f3f3f3fusing namespace std;struct node{ int exp; double co...原创 2019-02-09 21:43:03 · 167 阅读 · 0 评论 -
PAT甲级1001 A+B Format
注意和为负数与和为0的情况#include <bits/stdc++.h>#define ll long long#define INF 0x3f3f3f3fusing namespace std;int a, b, sum;int cnt = 0, len = 0;char ans[10];void read(){ scanf("%d %d", &a...原创 2019-02-09 20:37:26 · 174 阅读 · 0 评论