![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
PAT甲级
爱吃梦龙雪糕
这个作者很懒,什么都没留下…
展开
-
1132 Cut Integer (20 分)
很简单的一道题,考察的知识点有,string容器的使用,stoi函数的使用坑点如下1,一个数能整除两个数的乘积,则这个数可以分别整除两个数2,注意零不能做分母,否则会出现浮点错误。3,string中的函数,获取字符串的子串,参数分别是初始位置和长度。pre=temp.substr(0,num/2);整体代码如下#include<cstdio>#include<cstring>#include<iostream>using namespace std;原创 2021-08-25 16:22:48 · 35 阅读 · 0 评论 -
1130 Infix Expression (25 分)
给一个二叉树,输出中缀表达式,且加上括号表示运算的优先级~~。参考柳神的做法柳婼代码链接坑点如下1,给二叉树各节点赋值高度的方法2,中缀表达式递归的写法如果当前为叶子结点,直接返回自己的字符串,如果为非叶子结点(右子树不为空),那么返回递归左+当前字符串+递归右结点,并加上括号。如果左右结点有空的,返回字符串""#include<cstdio>#include<algorithm>#include<cstring>#include<iostrea原创 2021-08-22 22:20:16 · 65 阅读 · 0 评论 -
1129 Recommendation System (25 分)
用户推荐问题,本题考查的知识点有,对输入的数据按照出现次数及其编号进行排序,边输入变排序。参考柳神的写法,柳婼代码链接坑点如下1,set中存放结构题数组及其处理,注意结构体初始化方式。使得结构体在被存入set中时可以自动按照要求排序。struct Node{ int id; int number; Node(int a,int b):id(a),number(b){} friend bool operator<(const Node &a,const原创 2021-08-22 16:13:31 · 34 阅读 · 0 评论 -
1127 ZigZagging on a Tree (30 分)
树的生成问题。已知树的后序和中序遍历,求左右交替的层序遍历。本题考察的要点有已知树的后序和中序遍历,生成一颗树。再生成的树的各个结点中赋值深度。将各个深度的结点存储到数组中,按需输出坑点如下1,改变放入队列的左右孩子顺序无法解决这道问题,因为上一层中的最左端结点首先被压入了队列中。2,在存储的数组中,深度为偶数时,逆序输出,为奇数时,顺序输出(从0开始)。整体代码如下#include<cstdio>#include<algorithm>#include<原创 2021-08-21 17:28:53 · 49 阅读 · 0 评论 -
1125 Chain the Ropes (25 分)
贪心问题,要想生成最长绳子,应使得其中长段的绳子对折次数尽可能的少。坑点如下1,这题要求输出向下取整,开始理解成四舍五入了。附上四舍五入函数int round(double x){ return int(x+0.5);}整体代码如下#include<cstdio>#include<cstring>#include<algorithm>using namespace std;int n;int a[10010];int main(){原创 2021-08-21 17:18:02 · 84 阅读 · 0 评论 -
1123 Is It a Complete AVL Tree (30 分)
平衡二叉树问题,本题考察的知识点有,平衡二叉树的生成,左旋,右旋,如何判断一个树是否是完全二叉树,二叉树的层序遍历。坑点如下1,将左旋函数和右旋函数写反了导致段错误。整体代码如下#include<cstdio>#include<algorithm>#include<queue>using namespace std;struct Node{ int data,height; Node* lchild; Node* rchild;}原创 2021-08-20 21:40:28 · 70 阅读 · 0 评论 -
1119 Pre- and Post-order Traversals (30 分)
已知先序遍历和后序遍历,求中序遍历本题我参考了柳婼的做法柳神代码链接分析如下整体代码如下#include<cstdio>#include<vector>using namespace std;bool flag=true;int n;int post[35],pre[35];int num=0;vector<int>in;void getIN(int prel,int prer,int postl,int postr){ if(prel原创 2021-08-20 14:57:24 · 61 阅读 · 0 评论 -
1117 Eddington Number (25 分)
数学问题参考柳神的解法从大到小排序后结果为10、9、8、8、7、7、6、6、3、2。坑点如下1,根据排序后的数组可得知骑车大于等于 a[i] 英里的天数有 i+1 天,因为题目中要求超过E英里且所有的英里数为整数,所以可得知骑车超过 a[i]-1 英里的天数有 i+1 天2,最后求的是满足a[i]>=i+2的最大i+1;整体代码如下#include<bits/stdc++.h>using namespace std;int number[100100];int main原创 2021-08-20 10:08:35 · 54 阅读 · 0 评论 -
1118 Birds in Forest (25 分)
并查集问题,考察的点有,集合的合并,集合个数的计算,各集合中元素数量统计。坑点如下1,在函数内定义数组时注意要赋值0。整体代码如下#include<bits/stdc++.h>using namespace std;int father[10010];int vis[10010]={false};int cnt[10010];int n,q;int find(int x){ while(father[x]!=x){ x=father[x]; }原创 2021-08-20 09:38:52 · 45 阅读 · 0 评论 -
1115 Counting Nodes in a BST (30 分)
二叉搜索树的遍历,用DFS方法即可代码如下#include<cstdio>#include<vector>using namespace std;struct Node{ int data; Node* lchild; Node* rchild;};void insert(Node* &root,int data){ if(root==NULL){ root=new Node; root->data=原创 2021-08-19 13:31:32 · 43 阅读 · 0 评论 -
1114 Family Property (25 分)
这题用到了并查集的思想,我的代码参考了柳婼的代码。柳神代码链接坑点如下1,统计人数时不能只遍历输入的id,还要遍历与之相关的人,因此开vis数组,记录所有出现的人。2,比较函数注意要写return(在这一点上卡了很久)3,注意find函数写法,不建议使用递归,易错。int find(int x){ while(father[x]!=x){ x=father[x]; } return x;}整体代码如下#include<bits/stdc++.h>原创 2021-08-19 13:09:34 · 100 阅读 · 0 评论 -
1112 Stucked Keyboard (20 分)
字符串处理问题,参考了柳婼的代码。柳神代码链接坑点如下1,本题在字符串末尾再添加一个字符,否则当最后几个字符相等时存在判断问题。(当不相等时才能做出判断)2,我的方法,将可能存在问题的字符放入set容器,开nobroken数组存放一定没坏的键。最后判断时将set中有而nobroken中没有的输出即可整体代码如下#include<bits/stdc++.h>using namespace std;bool nobroken[256];int main(){ int k;原创 2021-08-19 10:47:48 · 64 阅读 · 0 评论 -
1108 Finding Average (20 分)
本题用以下两个函数十分容易解决。sscanf() – 从一个字符串中读进与指定格式相符的数据sprintf() – 字符串格式化命令,主要功能是把格式化的数据写入某个字符串中。sscanf() 的用法 sscanf(a,"%lf",&temp); printf("%lf\n",temp);输入输出2,sprintf的用法 sprintf(b,"%.2f",temp); printf("%s\n",b);整体代码如下#include<cstdio原创 2021-08-18 10:14:41 · 48 阅读 · 0 评论 -
1110 Complete Binary Tree (25 分)
判断一棵树是否是完全二叉树,本题开始写的很复杂,后来参考了柳神的代码,柳婼代码原地址~~坑点如下1,stoi函数的使用,将string变量转换成整型变量#include<iostream>for(int i=0;i<n;i++){ string l,r; cin>>l>>r; if(l=="-"){node[i].l=-1;} else{node[i].l=stoi(l);原创 2021-08-17 21:10:15 · 31 阅读 · 0 评论 -
1111 Online Map (30 分)
dijkstra+DFS标准题,本题使用两次即可坑点如下1,注意dijkstra算法循环不能写错2,注意输出格式,相同时中间为;而不是:Distance = 3; Time = 4: 3 -> 2 -> 5整体代码如下#include<cstdio>#include<algorithm>#include<cmath>#include<cstring>#include<vector>#include<queu原创 2021-08-17 15:56:47 · 31 阅读 · 0 评论 -
1040 Longest Symmetric String (25 分)
最长回文字符串长度统计坑点如下1,getline函数的使用#include<iostream>getline(cin,str);代码如下#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>#include<iostream>using namespace std;const int maxn=1010;string str;i原创 2021-08-15 12:27:55 · 36 阅读 · 0 评论 -
1007 Maximum Subsequence Sum (25 分)
dp问题中的最大连续子序列和,本题要求记录最大序列和的首尾元素。坑点如下1,dp的方法const int maxk=10010;int d[maxk];//存储输入元素int dp[maxk];//存储i结尾的最大子序列和2,首尾元素的计算方法创建首元素数组,记录对应元素。 if(d[i]>dp[i-1]+d[i]){ s[i]=i;//首元素为当前元素 } else { s[i]=s[i-1];/原创 2021-08-15 11:03:06 · 36 阅读 · 0 评论 -
1087 All Roads Lead to Rome (30 分)
dijkstra+DFS问题,本题涉及到的知识点有,在图中查找并存储最短路径,统计最短路径条数,多条最短路径求点权之和最小,利用map的方法将字符串转化成编号坑点如下1,编号统计,写一个函数如下。可将接收到的字符串自动转化为相应编号。int strtoID(string a){ if(strtoid.find(a)==strtoid.end()){ strtoid[a]=citynum; idtostr[citynum]=a; return ci原创 2021-08-14 10:53:54 · 41 阅读 · 0 评论 -
1072 Gas Station (30 分)
本题考察的知识点有,求图中到达指定点的最短路径所对应结点,如结点有多个求出其距离定点最远的结点,求路径的距离之和。坑点如下1,编号问题,要注意房子数目不止一个,否则最后一个测试点无法通过2,找出所求加油站,对各个加油站都采用一次dijkstra算法即可3,多次使用dijkstra算法时,要注意vis和d数组都要重新赋初值整体代码如下#include<cstdio>#include<cstring>#include<algorithm>#include&l原创 2021-08-13 21:29:21 · 73 阅读 · 0 评论 -
1030 Travel Plan (30 分)
dijkstra+DFS,本题涉及的知识点有,最短路径求取并统计,最短路径中求边权之和。坑点如下1,DFS中边权之和的求法 for(int i=temp.size()-1;i>0;i--){ int id=temp[i],next=temp[i-1]; //注意id和next分别表示当前结点和下一个结点 total+=C[id][next]; }整体代码如下#include<cstdio>原创 2021-08-13 18:27:29 · 31 阅读 · 0 评论 -
1018 Public Bike Management (30 分)
Dijkstra+DFS问题,本题涉及到的知识点有,最短路径统计,最短路径记录,路径优化坑点如下1,本题首先将所有最短路径统计出来。利用verctor容器2,利用DFS递归的方法,用vector容器temp将最短路径存储,并进行优化比较,总结出所求路径3,将bike数目整体减去cmax/2从而简化处理。4,注意点,在dijkstra中将d数初始化,在主函数中将G数组初始化,dijksra参数为初始结点,DFS参数为终止结点。代码如下#include<cstdio>#include原创 2021-08-13 17:47:38 · 34 阅读 · 0 评论 -
1003 Emergency (25 分)
本题涉及的知识点有,最短路径数目统计,在最短路径中找出点权最大的路径并求其最大点权。坑点如下1,最短路径数目统计,创建一个num数组来记录当前节点到起始点的最短路径数目int num[maxn]={0};2,最大点权统计int w[maxn];int weight[maxn];其中w[I]i到起始节点的最大点权之和,weight记录各节点点权3,dijkstra算法如下,注意初值的设定,d数组设无穷大,w[s]起始点权重,num[s]=1;void dijkstra(int s){原创 2021-08-13 11:03:20 · 37 阅读 · 0 评论 -
1013 Battle Over Cities (25 分)
本题考察图去结点后的连通分量个数计算。坑点如下1,若city被占,则该city无法访问,即可设该vis[city]=true,或者在DFS遍历到被删city时返回即可。2,添加道路树为连通分量数-1,直接计算即可整体代码如下#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>using namespace std;const int maxn=1100;co原创 2021-08-12 12:10:17 · 48 阅读 · 0 评论 -
1076 Forwards on Weibo (30 分)
图的遍历问题,本题用BFS方法更为简便坑点如下1,本题要求返回层数小于等于l的间接转发数,则根结点层数为02,数组赋初值的方法 memset(vis,false,sizeof(vis));3,BFS方法细节int BFS(int first){ int num=0; queue<int>Q; Q.push(first); node[first].level=0; vis[first]=true; while(!Q.empty()){原创 2021-08-12 11:16:11 · 35 阅读 · 0 评论 -
1034 Head of a Gang (30 分)
图的遍历问题,本题涉及到的知识点有1,计算图的总边权2,找出图中结点周围的总边权并找出具有最大总边权的结点3,统计一个连通分量的节点数4,考察图的遍历5,利用map将字符串转化成数字id坑点如下DFS代码如下void DFS(int index,int &head,int &number,int &total){ vis[index]=true; number++;//统计结点个数 if(weight[index]>weight[head原创 2021-08-11 13:36:48 · 32 阅读 · 0 评论 -
1098 Insertion or Heap Sort (25 分)
本题考察插入排序和堆排序的实现方法坑点如下1,插入排序的实现,可直接用sort函数实现2,插入函数实现时,要求为过程中的序列等于结果,所以第一次sort长度最小为2,同理堆排序也从第一次开始3,堆排序的实现,首先i为要交换的结点,j为其左子树,之后进入循环,如果j存在,则j取其左右子树中最大的数,如果大于i结点数值则交换i和j的值。之后重新取i=j,j=2*i;如果左右子树都小于i结点值,则退出循环,一次调整结束。(轮到i调整时i之后的结点都已调整完毕)void downAdjust(int lo原创 2021-08-10 12:47:30 · 134 阅读 · 0 评论 -
1107 Social Clusters (30 分)
本题考察并查集的实现。并查集即合并,查找,集合的缩写坑点如下1,集合的表示方法,由father数组来记录一个结点的父亲结点。2,查找根结点的函数注意,else return必须写,否则整个函数无返回值。数据也就无法更新int findfather(int x){ if(father[x]==x) {return x;} else return findfather(father[x]);}3,集合的合并,将元素a,b合并至同一集合,应将其各自的根结点合并void原创 2021-08-09 16:46:28 · 46 阅读 · 0 评论 -
1066 Root of AVL Tree (25 分)
本题考察平衡二叉树的生成。坑点如下1,树的结构体定义,增加了高度变量,2,写一个创建新结点函数创建新结点,令其高度为1,赋值数据,令其左右子树为空,返回值为结点指针。node* newnode(int v){ node* root=new node; root->height=1; root->data=v; root->lchild=root->rchild=NULL; return root;}3,更新高度的方法int g原创 2021-08-09 13:38:36 · 38 阅读 · 0 评论 -
1099 Build A Binary Search Tree (30 分)
任意二叉搜索树的构建方法,本题采用二叉树静态写法较为方便坑点如下1,将输入序列从小到大依次排列为对应二叉搜索树的中序遍历2,采用DFS方法将中序遍历序列依次存入二叉搜索树中,注意递归边界。void DFS(int root,int data){ if(root==-1)return ; DFS(node[root].lchild,in[num]); node[root].data=in[num++]; DFS(node[root].rchild,in[num]原创 2021-08-08 11:03:45 · 29 阅读 · 0 评论 -
1064 Complete Binary Search Tree (30 分)
本题考察完全二叉搜索树的生成方法,应充分利用完全二叉搜索树的性质。坑点如下1,通过对输入的序列从小到大排列得到中序序列(二叉搜索树的性质)2,设立一个CBT数组,应用完全二叉搜素树的性质将中序序列的数一一存入数组中。注意递归边界为,结点编号大于结点个数。void tree(int root){ if(root>n)return ; tree(root*2); CBT[root]=in[num++]; tree(root*2+1);}3,存储的CBT数组本身原创 2021-08-08 10:29:56 · 43 阅读 · 0 评论 -
1043 Is It a Binary Search Tree (25 分)
本题考点有,二叉搜索树的生成,先序遍历方法,镜像树的先序遍历,后序遍历,镜像树的后序遍历坑点如下1,学会通过一串序列生成相应的二叉搜索树,代码如下空函数,参数为结构体类型,根结点指针地址,循环边界为指针不指向任何元素,使得指针指向一个新结点,赋值,将结点指向的左右子树置空。之后按条件递归void insert(Node* &root,int data){ if(root==NULL){ root=new Node; root->data=dat原创 2021-08-08 09:55:05 · 45 阅读 · 0 评论 -
1053 Path of Equal Weight (30 分)
带权树的路径问题,这题我一开始用的是BFS方法,之后发现可以求出路径数组,但在对数组从大到小排序的过程中遇到了无法解决的问题。理解题意后发现这题用DFS方法更为简便坑点如下1,熟悉DFS的模板,注意递归边界。2,若采用DFS方法,要使得路径从大到小依次输入,只需对每一个非叶子结点,将其子节点按权从大到小排列即可bool cmp(int a,int b){ return node[a].weight>node[b].weight;}3,本题我采用vector容器path记录当前节点原创 2021-08-07 17:19:48 · 52 阅读 · 0 评论 -
1004 Counting Leaves (30 分)
家谱图问题,计算每层中叶子结点个数;坑点如下1,定义全局变量maxlevel记录最大深度。定义level数组记录每层叶子结点个数整体代码如下#include<cstdio>#include<cstring>#include<algorithm>#include<queue>#include<vector>using namespace std;int n,m;const int maxn=110;int level[110]原创 2021-08-07 11:18:21 · 30 阅读 · 0 评论 -
1106 Lowest Price in Supply Chain (25 分)
经销商问题,与前几题类似;坑点如下1,很大的数的表示方法const double INF=1e12;整体代码如下#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>#include<vector>#include<queue>using namespace std;const int maxn=100010;const doub原创 2021-08-06 19:51:05 · 59 阅读 · 0 评论 -
1094 The Largest Generation (25 分)
家族树问题,本题我用的是队列的方法坑点如下1,设置了一个levelnum数组记录每一代人数2,定义全局变量maxlevel记录有最大人数的代数3,整体代码如下#include<cstdio>#include<algorithm>#include<cmath>#include<queue>#include<vector>using namespace std;int maxp=-1;int n,m;const int ma原创 2021-08-06 19:48:17 · 41 阅读 · 0 评论 -
1090 Highest Price in Supply Chain (25 分)
经销商问题,本题为A1079的简化,这题我用的是队列来处理;坑点如下1,树的静态写法struct Node{ double price; vector<int>child; }node[maxn];整体代码如下#include<cstdio>#include<cstring>#include<cmath>#include<queue>#include<vector>using namesp原创 2021-08-06 18:51:25 · 32 阅读 · 0 评论 -
1079 Total Sales of Supply Chain (25 分)
本题我采用的是树的静态表示方法坑点如下;1,注意本题求经销商按成本价卖出的销售额2,本题采用队列方式,另有DFS写法;整体代码如下#include<cstdio>#include<cmath>#include<algorithm>#include<vector>#include<queue>using namespace std;const int maxn=100100;int n;double p,r;struct原创 2021-08-06 17:10:06 · 39 阅读 · 0 评论 -
1102 Invert a Binary Tree (25 分)
反转二叉树本题采用静态二叉树较为方便,注意静态二叉树的写法;1,静态二叉树的写法struct Node{ int data; char lchild; char rchild;}node[15];2,层序遍历的写法其中队列里是结构体。void layerorder(int root){ queue<Node>Q; Q.push(node[root]); while(!Q.empty()){ Node q=Q.front()原创 2021-08-06 16:05:09 · 48 阅读 · 0 评论 -
1086 Tree Traversals Again (25 分)
用栈来模拟一颗二叉树的先序和中序过程,求这颗二叉树的后序遍历序列坑点如下1,由题意栈的输入顺序和先序遍历的顺序一致,栈的输出为中序遍历一致。2,创建二叉树的写法其中当先序长度小于等于0时返回值为空(由于函数为node型函数)创建一个新的node地址变量 rootNode s = new Node是在堆中申请一块内存并存放一个Node类的新对象。之后给变量指向的结点赋值。用递归的方式分别创建其左右子树node* create(int preL,int preR,int inL,int inR原创 2021-08-06 13:58:44 · 34 阅读 · 0 评论 -
1020 Tree Traversals (25 分)
考察树的遍历,本题为已知后序遍历和中序遍历求层序遍历坑点如下1,层序遍历的生成方式,其参数为node型变量的地址,实际求时为根结点地址,生成一个队列,其中装有结构体型的地址,将根地址送入队列,之后进入循环,将队列开头输出并将其左右子树压入队列;void layerorder(node* root){ queue<node*>q; q.push(root); while(!q.empty()){ node* now=q.front(); q.原创 2021-08-05 17:11:10 · 64 阅读 · 0 评论