
PATA
PATA题解
青铜亡者
这个作者很懒,什么都没留下…
展开
-
PATA 1030 Travel Plan
题记这道题我想记录的地方是这道题需要记录最短路径的路线。其他地方跟另一道题思路基本一样,点击查阅PATA 1003 Emergency 思路:1.首先考虑如何记录;假设当前到原点s最短距离的点是u,u再往外走一步的结点记为v,u的最短距离是d[u],c[u]指到u的最优路径的花费,cost[u][v]是u到v的花费,pre[v]记录到结点v的最优路径的前驱结点;如果d[u]+G[u][v]<d[v],那么更新v的前驱结点pre[v]=u;如果d[u]+G[u][v]==d[v]并且c[u].原创 2020-08-13 14:17:46 · 152 阅读 · 0 评论 -
PATA 1003 Emergency
题记本题在最基础的单源结点最短距离的基础上增加了点权,并且让求出最短距离路线的条数。关键思路(如何求最短路线条数和召集最多的救援人员)假设当前到原点s最短距离的点是u,u再往外走一步的结点记为v,u的最短距离是d[u],它的最短路线数目是num[u],它所在位置(距离最短的前提下)最多能到达的救援人员数目是w[u],v点同样,G[u][v]记录了u到v的距离此时u的相关信息是已经是最优的了1.如果d[u]+G[u][v]<d[v],说明v借助u可以达到更优,那么d[v]=d[u]+G[u]..原创 2020-08-13 11:17:35 · 193 阅读 · 0 评论 -
PATA 1076 Forwards on Weibo
#include <iostream>#include <queue>#include <vector>#include <cstring>using namespace std;const int Maxn=1010;struct Node{ int layer; int id;};//输入int N,L;vector<Node> Adj[Maxn];//邻接表bool inq[Maxn]={fa..原创 2020-08-12 11:31:51 · 136 阅读 · 0 评论 -
PATA 1034 Head of a Gang
栽的坑记录一下1.通话记录一共不超过1000,那么最多有多少人呢?2000!!!2.//给一个顶点DFSvoid DFS(int nowMember,int &gangNum,int &head,int &totalTime){ isTraver[nowMember]=true; gangNum++; if(weight[nowMember]>weight[head]) head=nowMember; for(int ..原创 2020-08-12 11:31:26 · 173 阅读 · 0 评论 -
PATA 1079 Total Sales of Supply Chain
题记思路这道题读懂题就好做多了。大概意思就是每个结点的销售单价都比父结点的单价贵%r,计算最后零售店的销售额。首先建立起一棵树,这棵树不是二叉树,所以需要用vector来保存孩子结点的下标。之后再找到每个叶子结点的高度(用来计算单价)具体步骤1.建立结点的数据结构,读入数据,在读入数据的同时建立起二叉树2.进行先根遍历,根节点的深度是0,往下每次一层深度加一3.根据叶子结点深度计算各自的销售额并且相加易错点1.不要在读入数据的时候简单的认为孩子结点的深度等于当前结点深度加一就急着更新记录..原创 2020-08-11 14:13:50 · 168 阅读 · 0 评论 -
PATA 1102 Invert a Binary Tree
题记思路:首先得先建立一棵二叉树,但是这道题我怎么想也没想出来用传统的方法(结构体,然后指针),因为最一般的方法建树我们需要知道根节点,需要按照顺序往下建立,但是题目中输入的顺序让我们没法直接做,如果我们先保存这些信息。然后遍历找到根节点再建树好像可以,但是好像没有必要用指针,因为我们的结点只有下标没有值。有没有输入完就建立完呢?仔细思考发现是可以的。1.建立结点结构体,每个结点有3个值,左孩子,右孩子,父亲结点的下标2.输入的时候判断左孩子右孩子在不在,在的话把孩子的结点进行赋值,不存在就是-1.原创 2020-08-11 11:13:46 · 99 阅读 · 0 评论 -
PATA 1086 Tree Traversals Again
题记思路:1.题目中的push顺序其实就是先序遍历的顺序,pop的时候顺便访问,这样得到的顺序其实就是中序遍历顺序,这两者可以唯一确定一棵二叉树2.对于输入可以一行一行地输入,也可以先输入一个string再输入一个整数,这里我用的是一行一行输入,如果开头是Push那么就把数组前面删掉,然后计算一下数字是多少,压入栈中,顺便把它加到先序遍历数组中;如果是pop就把栈顶元素加到中序遍历数组中并把栈顶元素出栈。3.之后是常规的后序遍历,递归就可以了,注意末尾不要多加一个空格注意:1.题目一定要看清..原创 2020-08-11 09:59:52 · 174 阅读 · 0 评论 -
PATA 1052 Linked List Sorting
题记思路: 1.建立结点结构体,存储该结点的位置,值,下一个结点的位置,写一个"<"重载,后面优先队列队列就会自动地排序 2.根据头结点遍历一遍这个链表,并把链表中的结点放入利用优先队列当中 3.最后是输出,如果记录的num(链表上有效的结点数目)为0,输出"0 -1",如果不为0,先输出num和队列里的第一个结点的位置,之后循环,先输出队列最前面的结点的位置和值,先别急着输出下一个结点的位置,因为这是一个新的值,而我们并没有改变next,所以先判断一下还有几个结点在队列里,如果还有,就..原创 2020-08-09 14:01:43 · 124 阅读 · 0 评论 -
PATA 1053 Path of Equal Weight
题记思路:1.这道题是普通的树,建立结点的结构体,用vector来存储孩子结点的下标2.用vector来存储当前得到的路径,递归的前依次把当前结点的孩子加进容器,递归后记得pop_back()。3.进入dfs,参数为index,sum分别指当前结点的下标和当前路径的权值和,如果sum>s直接return;如果sum==s首先判断当前结点是不是叶子,若不是return,若是依次输出路径上各结点的权重;如果sum<s那么进行循环,分别把当前结点的孩子加进path中进行递归,记得递归完p...原创 2020-08-08 19:34:06 · 208 阅读 · 0 评论 -
PATA 1020 Tree Traversals
题记思路1.创建结点的结构体2.根据中序遍历和后序遍历递归地创建二叉树。假设中序遍历当前的树下标为inL,inR,后序遍历当前的树下标是poL,poR。后序遍历最后一个就是根结点,循环中序遍历找到根结点,记录下标为k,中序遍历左边的是左子树,右边的是右子树,得到左子树结点个数为numLeft=k-inL,于是得到当前的树的左子树中序遍历下标范围为[intL,K-1],后序遍历为[poL,poL+numLeft-1],右子树中序遍历下标范围为[k+1,inR],后序遍历下标范围为[poL+numLef.原创 2020-08-08 14:12:34 · 121 阅读 · 0 评论 -
PATA 1032 Sharing
题记思路1:采用静态链表的数据结构2:为了方便识别第一个重复的节点,结构体里再设置一个flag,标志是否是第一个链表的节点3:从第一个链表的起点开始遍历,经过的结点都设置为true,再遍历第二个链表遇到的第一个为true的节点就是公共后缀的第一个字符,如果没有为true的,就输出-1易错点:1:使用%05d的格式输出。2:因为%c会把空格也读进去所以在连续输入地址、数据、后继结点地址时不能写成%d%c%d,必须加空格写成%d %c %d的形式代码如下#include <ios..原创 2020-08-07 13:01:35 · 175 阅读 · 0 评论 -
PATA 1077 Kuchiguse
这道题我觉得最关键的就是能看懂题,好好学英语很重要,大概意思就是让你找到下面这些字符串最大的公共后缀大概思路就是先把每个字符串读进来然后翻转,最大公共后缀就变成了最大公共前缀这就简单很多了,读进去的时候顺便把最小字符串长度min找到,最大的公共后缀的长度最大就是min,然后从下标为0开始判断当前字符是否都相等,相等就加到ans里,不相等就出来,最后把ans翻转过来,如果ans的字符数量为0就输出"nai"否则直接把ans打出来代码如下#include <iostream>#inc..原创 2020-08-05 13:17:10 · 164 阅读 · 0 评论 -
PATA 1035 Password
很常规的字符串处理其实这道题用find(str)和replace(it1,it2,str2)也可以,但是仔细想想其实还不如自己循环然后手动if方便呢代码如下#include <iostream>#include <string>using namespace std;const int MaxN=1000+5;struct account{ string name,password; bool modify=false;//默认没有被修改};..原创 2020-08-05 11:34:29 · 180 阅读 · 0 评论 -
PATA 1001 A+B Format
记录一下自己栽的坑。一开始19分,我还以为是不够三位的补前导0,试了一下就剩10分了,最后发现自己0的情况没有判断(因为我的while循环条件是大于0)我把0的给忘了,注释写得很清楚,这里就不再赘述了。#include <iostream>#include <string>#include <algorithm>using namespace std;int main(){ string ans; int a,b,sum=0; c.原创 2020-08-05 10:23:25 · 162 阅读 · 0 评论 -
PATA 1024 科学计数法
代码如下注释很多就不再写题记了,注意消掉指数部分的前导0#include <iostream>#include <string>using namespace std;int main(){ string num,exponent;//E前面的系数和E后面的指数分开存 getline(cin,num,'E');//读到E停并且把E给删了 getline(cin,exponent); if(num[0]=='-') co.原创 2020-08-04 20:49:11 · 139 阅读 · 0 评论 -
PATA1005 Spell It Right
#include <iostream>#include <string>#include <stack>using namespace std;string change[]={"zero","one","two","three","four","five","six","seven","eight","nine"};int main(){ stack<string> stk; string num; cin>&.原创 2020-08-05 10:54:25 · 107 阅读 · 0 评论