PAT
vs5
这个作者很懒,什么都没留下…
展开
-
1040 Longest Symmetric String (25 分)
最长回文子串 1.dp 2.双指针 dp #include <iostream> #include <cstring> using namespace std; const int N = 1010; bool f[N][N];//f[i][j] 表示i~j是否为回文 1是回文,0不是 int main() { memset(f,true,sizeof f); string s;int ans = 1; getline(cin,s); f原创 2022-02-20 12:45:00 · 296 阅读 · 0 评论 -
1093 Count PAT‘s (25 分)
第一种思路求出每个A左右两遍P,T的个数,然后相乘求和。 第二种,遍历一遍字符串,每次出现一次A就累加前面P,每次出现一次T再累加前面A,最后T就是答案,只要其中一个没出现最后T肯定是0,T的值由前面A决定,A由P决定。 #include <iostream> using namespace std; long long P,A,T,mod = 1e9 + 7; int main() { string s; cin >> s; for(auto c :原创 2022-02-19 18:57:03 · 146 阅读 · 0 评论 -
1043 Is It a Binary Search Tree (25 分)
给出一个树的遍历序列,如果是二叉搜索树的前序遍历或者其镜像的前序遍历,那么就输出后序遍历。 利用二叉搜索树的中序遍历是有序来求后序遍历并判断给定的序列是否是二叉搜索树的前序遍历。如果原序列不对,那就进行一次镜像的判断,此时中序是降序,注意找根的时候要从右->左找。 其实就是跑两遍前序中序求后序。 #include <iostream> #include <vector> #include <algorithm> using namespace std; co原创 2022-02-19 18:39:14 · 559 阅读 · 0 评论 -
1044 Shopping in Mars (25 分)
找到区间和等于w,如果不存在,就让区间和大于w取最小。 前缀和+双指针 #include <iostream> using namespace std; const int N = 100010; int a[N],b[N]; //前缀和+双指针 int main() { int n,w; cin >> n >> w; for(int i = 1; i <= n; i ++) cin >> a[i]; for(in原创 2022-02-19 16:15:06 · 373 阅读 · 0 评论 -
1053 Path of Equal Weight (30 分)
求从根节点到叶子节点路径权值和等于w的全部路径 单调递减输出,我们直接把路径上的权值存到二维vector里,对vector进行排序。 #include <iostream> #include <vector> #include <algorithm> using namespace std; int n,m,w,r,k,x,v[1010],cnt,idx; vector<int>e[1010],ans[1010],res; void dfs(int u,原创 2022-02-18 17:15:26 · 142 阅读 · 0 评论 -
1063 Set Similarity (25 分)
Nc:两个集合共有的不同数的个数,其实就是检查去重后,两个集合相等数的个数 Nt:两个集合中不同数的个数,其实就是去重后有多少个数 #include <iostream> #include <unordered_set> #include <unordered_map> using namespace std; int main() { int n,k; cin >> n; unordered_map<int,unorder原创 2022-02-17 18:59:23 · 145 阅读 · 0 评论 -
1064 Complete Binary Search Tree (30 分)
1.完全二叉搜索树的中序遍历是有序的 2.完全二叉搜索树的最大节点编号等于节点个数 所以我们就可以根据这两点,先将读入的数据排序,然后跑一边中序遍历! #include <iostream> #include <algorithm> using namespace std; int v[1010],in[1010]; int n,x,cnt; void dfs(int u) //中序遍历,完全二叉树的最大节点编号等于节点个数 { if(u > n) return原创 2022-02-17 17:35:35 · 209 阅读 · 0 评论 -
1071 Speech Patterns (25 分)
题目大意:给定一个字符串,求哪个词组出现最多次,次数相同去字典序小的 getline读取一行 词组包含字母和数字,每个词组间会被非数字字母分隔。 #include <iostream> #include <unordered_map> using namespace std; unordered_map<string,int>mp; int main() { string s; getline(cin,s); for(auto &原创 2022-02-16 21:47:33 · 148 阅读 · 0 评论 -
1072 Gas Station (30 分)
题目大意:要确定一个加油站,到所有居民房的最短距离最大,如果不唯一,输出平均距离最短的加油站,如果还不唯一,输出id小的。 注意:所有的居民房都必须要服务范围内! 假设有m个加油站,需要跑m次最短路,最后注意答案输出的精度。 #include <iostream> #include <cstring> using namespace std; const int N = 1015; int n,m,k,d; int g[N][N],dis[N]; bool st[N]; vo原创 2022-02-16 20:53:44 · 183 阅读 · 0 评论 -
1075 PAT Judge (25 分)
注意没有编译通过的id不能被输出。 #include <iostream> #include <algorithm> using namespace std; struct node { int id; int sum[6],flag[6]; int sol,res,f; bool operator < (const node &w) { if(res != w.res) return res > w原创 2022-02-16 14:49:31 · 71 阅读 · 0 评论 -
1076 Forwards on Weibo (30 分)
题目大意:给定每个用户的关注,求在L层内最大转发的数量。 这题时限3000ms,应该想考的是floyd,但是我们正常看到这种类型的题会直接去搜索。 给出搜索和floyd的代码 bfs #include <iostream> #include <queue> #include <cstring> using namespace std; vector<int>v[10010]; bool st[10010]; int k,x,n,l; int bfs(原创 2022-02-15 20:27:03 · 131 阅读 · 0 评论 -
1079 Total Sales of Supply Chain (25 分)
已经出现了很多次这种题了,做法也都是一样。 #include <iostream> #include <queue> #include <unordered_map> #include <cmath> using namespace std; int n,k,x; double p,r,ans; vector<int>e[100010]; unordered_map<int,int>mp,cnt; void bfs() {原创 2022-02-15 16:24:14 · 246 阅读 · 0 评论 -
1080 Graduate Admission (30 分)
一道排序模拟题,按总成绩和初试成绩排序,注意如果出现并列排名,并且并列申请人正在申请同一所学校,就算名额满了,学校都要录取。 #include <iostream> #include <vector> #include <algorithm> using namespace std; int v[110],n,m,k; struct node { int ge,gi,id,sum; int ch[10]; bool operator <原创 2022-02-15 15:35:09 · 225 阅读 · 0 评论 -
1086 Tree Traversals Again (25 分)
入栈是前序,出栈是中序 #include <iostream> #include <vector> using namespace std; const int N = 50; int stk[N],top,f; vector<int>pre,in; //入栈是前序,出栈是中序 void dfs(int preL,int preR,int inL,int inR) { if(preL > preR) return ; int k = inL; w.原创 2022-02-14 16:35:39 · 67 阅读 · 0 评论 -
1087 All Roads Lead to Rome (30 分)
多条件限制的最短路,数据范围很小,直接写个朴素版。 用两个map存名字对应编号,和编号对应名字 见代码 #include <iostream> #include <unordered_map> #include <cstring> using namespace std; const int N = 300; int g[N][N],dis[N],disha[N],ha[N],path[N],cnt[N],res[N],n,m; bool st[N]; strin原创 2022-02-14 16:07:03 · 150 阅读 · 0 评论 -
1094 The Largest Generation (25 分)
题目大意:给出一个族谱树,相同一层为一代人,求人数最多的一代,和第几层。 bfs,dfs都可以 #include <iostream> #include <queue> #include <unordered_map> using namespace std; vector<int>e[200]; unordered_map<int,int>mp,root; int u,h,s; void bfs() { queue<pair<原创 2022-02-14 12:31:47 · 130 阅读 · 0 评论 -
1095 Cars on Campus (30 分)
题目大意:给出每个车牌的进出时间,每一个in只与下一个相同号牌的out匹配,若没有匹配的in或out则被忽略,然后给出相应的询问,求某个时间段内的有多少辆车停留,并求出停留的最长时间。 思路: 1.先将所有数据读入按车牌号和时间排序。(时间化为秒) 2.两两比较,处理出合法的车牌,并用map保存每个车牌的停留总时间,记录最大值。 3.处理询问,可以预处理每个时间段车辆停留的个数(前缀和,经测试不用前缀和也不会超时) 4.最后就是遍历一遍map把相同停留时间的车牌输出即可 如果停留最长时间的车辆不原创 2022-02-14 12:28:58 · 134 阅读 · 0 评论 -
1103 Integer Factorization (30 分)
题目大意:将一个数n,划分k个数的p次方的和。 dfs:预处理小于n的p次方所有的数,然后从最大的数开始搜索,注意剪枝。 背包:其实就是求容量为n的背包可以装的最大价值(各位数之和最大) 搜索代码 #include <iostream> #include <cmath> #include <vector> using namespace std; const int N = 10001; int n,k,p; int v[N],s = 1,maxsum = -1原创 2022-02-13 12:50:13 · 214 阅读 · 0 评论 -
1106 Lowest Price in Supply Chain (25 分)
题目大意:供应商为根节点,零售商为叶子节点,从上向下供应商品,每次向下一层价格会上涨r%,求出售的最低价格,和这个价格的数量。 bfs,dfs都可以,求一下这棵树的最小深度,和最小深度这个节点的数量。 #include <iostream> #include <vector> #include <cmath> using namespace std; vector<int>v[100010]; int minh = 1e9,sum; void dfs(i原创 2022-02-12 21:29:54 · 269 阅读 · 0 评论 -
1107 Social Clusters (30 分)
题目大意:每个人都喜欢一些活动爱好,有相同爱好的算一个群体,输出群体的个数,以及每个群体的人数,从大到小输出。 转化题意求连通块的数量,以及块内点的个数。这里不要把爱好编号和人的编号混掉了,我们把活动爱好用人的标号来标记,然后就是并查集模板了。 #include <iostream> #include <vector> #include <algorithm> using namespace std; const int N = 1000; int p[N],st[原创 2022-02-12 20:13:30 · 151 阅读 · 0 评论 -
1110 Complete Binary Tree (25 分)
题目大意:给定每个节点的左右孩子,判断这棵树是不是完全二叉树 如果最大节点编号等于节点数那么就是完全二叉树 #include <iostream> #include <queue> #include <unordered_map> using namespace std; int n,last,res; struct Eg { string l,r; }e[100]; unordered_map<int,int>mp; void dfs(int u,i原创 2022-02-12 16:49:45 · 423 阅读 · 0 评论 -
1111 Online Map (30 分)
题目大意:最短路!给定n个点,m条边,可能是无向边,可能是有向边,再给定两点之间的距离,时间,最后给出起点终点,求起点到终点的最短路路径和最快到达路径。 最短路路径:如果最短路不唯一,相同最短路取最快到达的路径。 最快到达路径:如果最快到达路径不唯一,输出经过最少点的路径。 如果路径相同输出 Distance = D; Time = T: source -> u1 -> ... -> destination 如果不相等输出 Distance = D: source -> v原创 2022-02-12 15:51:05 · 288 阅读 · 0 评论 -
112 Stucked Keyboard (20 分)
题目大意:如果一个键盘卡住,就会连续输出k次,判断哪些键盘卡住了,并且输出原序列 注意点:假如一个字符出现过连续k次和不是连续k次的,那么这个键就是好的。(k的倍数) #include <iostream> #include <unordered_map> #include <vector> using namespace std; unordered_map<char,int>mp1,mp2,st; int k,cnt; int main() {.原创 2022-02-12 00:56:17 · 205 阅读 · 0 评论 -
1114 Family Property (25 分)
题目大意:给定每个家庭成员的关系,需要求每个家庭的人数,人均房产套数,人均面积。按人均房产面积降序输出,如果相等按id升序输出(id是每个家庭中最小的id) 一看就是一个并查集的题目,需要输出的是最小id,所以我们要以最小id为根节点建树。 题目不难,转化一下题意就是求连通块的数量,以及每个连通块内点的个数,并附带更新一下房产的信息。 题目我踩坑了,我连通块内点的个数初始化的时候没有把0000这个编号算进去,debug了半天。。。 #include <iostream> #includ原创 2022-02-11 17:00:17 · 93 阅读 · 0 评论 -
1115 Counting Nodes in a BST (30 分)
题目大意:按给定的序列,建二叉搜索树,求最后两层节点数量 插入节点建树,宽搜或深搜求每层的节点数量 #include <iostream> #include <queue> #include <unordered_map> using namespace std; int n,x,f; unordered_map<int,int>mp; struct node { int v; node *left,*right; node(int x): v(x原创 2022-02-11 14:03:33 · 62 阅读 · 0 评论 -
1118 Birds in Forest (25 分)
题目大意:给定若干个照片,照片树上有若干个鸟,判断有多少棵树和多少只鸟,然后给定若干个查询,判断两只鸟是否在一棵树上。 题目说到鸟的编号一定是1到某个数连续的,所以鸟的数量就是最大值编号,如果这没读懂没关系,直接用set存每只鸟,最后的长度就是数量。 鸟的数量解决了,树的数量其实就是求连通块的数量,这里就可以用dfs,bfs,或者并查集来实现,但是后面我们需要来查询两只鸟是否在同一棵树,所以本题用并查集写方便。 #include <iostream> #include <vecto原创 2022-02-11 13:21:35 · 67 阅读 · 0 评论 -
1119 Pre- and Post-order Traversals (30 分)
题目大意:给定前序和后序遍布,来判断中序遍历是否唯一 因为当一个节点只有一个孩子的时候,不管是左孩子还是右孩子,他们的前序遍历都是一样的,后序遍历也是一样。 A A / \ B B \ / C C 这两个树的前序都是ABC后序都是CBA,所以我们无法确定左右孩子。 我们知道前序和后序不能唯一确定一颗树,前序是根左右,后序是左右根,我们发现前序遍历的第一个节点preL肯定是等于后序遍历的最后一个节点postR,preL+1是左孩子(当左孩子不存在,就是右孩子),postR-1是右孩子(同理),原创 2022-02-11 12:30:04 · 462 阅读 · 0 评论 -
1122 Hamiltonian Cycle (25 分)
哈密顿回路满足的条件 1.经过所有点 2..终点和起点相同 3.回路的点数等于图顶点+1(也就是除去起点终点每个点都走一次) #include <iostream> #include <vector> #include <unordered_map> using namespace std; int n,m,a,b,T; int g[300][300]; int main() { cin >> n >> m; for(int i =原创 2022-02-10 22:51:19 · 177 阅读 · 0 评论 -
1123 Is It a Complete AVL Tree (30 分)
本题主要掌握左旋右旋的操作就可以解了。 判断是否为完全二叉树:第一种方法在层次遍历的时候记录索引编号,最后一个点的编号等于节点的个数就是完全二叉树,第二种方法,如果在层次遍历的时候出现一个某个孩子为空的节点,那么如果之后出现某个孩子不为空的节点那么就不是完全二叉树,否则就是。 #include <iostream> #include <queue> using namespace std; struct node { int v; node *left,*right; n原创 2022-02-10 22:10:03 · 276 阅读 · 0 评论 -
1126 Eulerian Path (25 分)
题目大意:判断一个无向图,是欧拉图还是半欧拉图 1.所有点连通,且度数都为偶数:欧拉图 2.所有点连通,有两个点度数为奇数,其余为偶数:半欧拉图 不满足1,2就是非欧拉图 这道题扩展一下还可以找欧拉回路或者欧拉路径,有奇点就从奇点开始找,没有就从任意点开始找。 言归正传,本题邻接矩阵建图,然后dfs一遍求连通点的数量,然后根据题意判断即可! 附上本题代码 #include <iostream> using namespace std; const int N = 1000; in原创 2022-02-10 14:26:28 · 112 阅读 · 0 评论 -
1127 ZigZagging on a Tree (30 分)
题目大意:给定一个中序和后序序列,求层次遍历,注意不是普通的层次,这个题目的输出要求是每隔一层要逆序输出。 正常中后序建树,数据范围小就可以不用哈希表优化建树,然后宽搜一遍把层次遍历存一下,然后将需要逆序的层翻转一下就行了。 #include <iostream> #include <queue> #include <algorithm> using namespace std; const int N = 1000; int post[N],iner[N],f,c原创 2022-02-10 13:25:44 · 60 阅读 · 0 评论 -
1130 Infix Expression (25 分)
题目大意:求一个二叉树的中缀表达式 首先表达式树是不存在左孩子非空,右孩子空的情况。 直接根据中序遍历,不过需要加上()表示运算的优先级,在中序遍历的时候,不是根结点且不是叶子结点输出括号即可。 #include <iostream> using namespace std; int n,m,root; struct node { string v; int l,r; }e[100]; bool st[100]; void dfs(int u ) { if(root !=原创 2022-02-09 15:52:51 · 441 阅读 · 0 评论 -
1131 Subway Map (30 分)
题目大意:给定一个无向图并带有编号,给定两个点,求两点最短路径,如果存在多条最短路径,要求取换乘最少的路径。 单源最短路径,权值为1可以直接bfs,也可以dfs+剪枝或者dijkstra,这里dijkstra需要堆优化。 本题难就难如何建图上,要保存两点之间的路线编号,可以用偏移量存储两点的编号,也可以直接邻接表同步信息。 下面提供dfs和dijkstra版本的代码 dfs #include <iostream> #include <queue> #include <原创 2022-02-09 14:42:52 · 264 阅读 · 0 评论 -
1134 Vertex Cover (25 分)
题目大意:给你一个图,然后再给定若干个集合,判断图中每条边的两个端点是否都至少有一个点在集合中,是输出Yes,否则No 邻接表建图,不需要建无向图,把集合存在哈希表里,然后查询图中每对边的端点是否至少有一个点在哈希表中即可! #include <iostream> #include <vector> #include <unordered_set> using namespace std; int n,m,a,b,k,x; vector<int>e[10原创 2022-02-08 22:26:20 · 56 阅读 · 0 评论 -
1139 First Contact (30 分)
题目大意 A暗恋B 找到一个A的同性朋友C,B的同性朋友D,如果C,D是朋友关系那就输出 用map套个set来实现邻接表(懒得写vector)。 判断同性的方法:女性id前有负号,因为可能存在-0000,所以我们用字符串读取,长度相等就是同性,题目存在同性恋 注意C不等于B,D不等于A #include <iostream> #include <unordered_map> #include <vector> #include <unordered_set原创 2022-02-08 19:05:25 · 141 阅读 · 0 评论 -
1138 Postorder Traversal (25 分)
题目大意:前序中序求后序 老套路题了,不过需要注意N最大取到50000,正常会超时,但是数据好像没取到极限,正常做刚好可以过。 为什么会超时,正常做的时候会耗费直接去查找根结点,所以我们直接用哈希表优化。 可以试试用哈希表和不用,确实速度差了好多。 #include <iostream> #include <unordered_map> using namespace std; const int N = 50010; int n; int pre[N],in[N],f =原创 2022-02-08 00:28:26 · 213 阅读 · 0 评论 -
1142 Maximal Clique (25 分)
题目大意:有一个无向图,判断所给的集合是否为最大团 1.如果集合内的某两个点不能连通,那么就不是团。 2.如果集合的点都能相互连通,且都至少能连向集合外相同的一个点,那么就不是最大团,否则就是最大团 这一题就是直接枚举就好了 #include <iostream> #include <vector> #include <unordered_map> using namespace std; const int N = 300; int n,m,k,a,b; in原创 2022-02-07 23:38:13 · 247 阅读 · 0 评论 -
1143 Lowest Common Ancestor (30 分)
题目大意:给一个前序遍历的二叉搜索树,求两点的最近公共祖先。 二叉搜索树 左<根,根<=右,所以中序遍历一定是升序的。 1.老套路,先建树,然后再找最近公共祖先 2.不用建树,根据性质直接遍历一遍前序遍历,因为中序遍历是有序。(左根右) 建树的代码 #include <iostream> #include <vector> #include <unordered_map> using namespace std; // 前序二叉搜索树,中序遍历就是原创 2022-02-07 22:27:59 · 329 阅读 · 0 评论 -
1150 Travelling Salesman Problem (25 分)
题目大意:给一个无向图和一些路径,判断路径是否为环,且环分为简单环和旅行商环。 如果一个路径经过所有点,其头尾点相等,那么他就是一个环,在这个环上除去源点都只走过一次,(源点两次)那么就是简单环,否则就是旅行商环。 如果两个点之间没有连接,那么就不存在环。 #include <iostream> #include <cstring> #include <queue> #include <unordered_map> using namespace st原创 2022-02-06 21:11:07 · 196 阅读 · 0 评论 -
1151 LCA in a Binary Tree (30 分)
### 题目大意:已知一个树的前序和中序序列,求两个结点的最近公共祖先 本着试一试的做法,直接建树,然后套倍增求LCA的算法,还好数据不是很大,没卡爆数组。 #include <iostream> #include <unordered_set> #include <cstring> #include <cmath> using namespace std; const int N = 10010; int n,m,pre[N],iner[N].原创 2022-02-06 16:18:41 · 255 阅读 · 0 评论