1001 A+B Format (20分)

因为一定会用到字符串,而string非常好用,但是用的时候一定要注意不能越界访问,否则会在运行时出现abort() has been called。

1002 A+B for Polynomials (25分)

循环输入累加即可,只不过要注意题目中所说where K is the number of nonzero terms in the polynomial,也就是不能有0的项,所以一定要在累加时加一个是否为0的判断,而题目还要求**Please be accurate to 1 decimal place.**也就是保留一位小数.

1003 Emergency (25分)

其实就是在Dijkstra算法的基础上加了一些数据,将这些数据随着算法进行更新即可(这里可能不止一条最短路径!!!),值得注意的是题目中要求输出的是最短路径的条数以及最短路径中救援队(点权)之和中的最大值,千万不要被例子误导,因为例子中的最短路径的条数和最短路径长度相同。

1004 Counting Leaves (30分)

因为题目中说For the sake of simplicity, let us fix the root ID to be 01. 也就是简单起见,根节点的id就是01,这就很方便了,01就是递归的入口。
显然我们的输入是很多个分支(仅有两层:一个父节点和其子节点),而我们要找到每层的叶子结点数从01的子节点开始遍历找起即可,01就是第0层。对于没有子节点的结点,当前层数的叶子结点数+1,如果有子节点,接着遍历其子节点,别忘了层数+1。

1005 Spell It Right (20分)

N (≤10​100). 故N必须声明为字符串类型,再求各位和。

1006 Sign In and Sign Out (25分)

像类似于题目中时间HH:MM:SS这种特殊格式,完全可以用scanf("d%:%d:%d:".....)的格式以整型数据输入时间,而不是用字符串输入再去麻烦的转换。此外,比较时间也不必时分秒逐个比,直接统一成秒比较即可。

1007 Maximum Subsequence Sum (25分)

很典型的最大子序列和问题。题目说 In case that the maximum subsequence is not unique, output the one with the smallest indices i and j (as shown by the sample case),结果不唯一,只要求输出最小的i和j,因此边输入边计算即可。还有If all the K numbers are negative, then its maximum sum is defined to be 0, and you are supposed to output the first and the last numbers of the whole sequence. 别忘了最后判断一下结果是否小于0,小于0说明序列中所有元素都小于0,此时最大子序列和应为0。并且输出的是序列数,不是下标!!!

1008 Elevator (20分)

主要还是题意的理解:开始在第0层,每上升一层用6s,每下降一层用4s,到达目的楼层后停留5s,随着输入累加时间即可。要注意的是没说不能从同一楼层到同一楼层,所以不管什么情况都要等5s。

1009 Product of Polynomials (25分)

和1002 A+B for Polynomials (25分)非常相似,但注意这里变了,1002 A+B for Polynomials (25分)时所有Ni相同的项合并为一个,而这里是两行数都两两配对,配对后的Ni的和相同的会合并,所以我们不能在两重循环中累积运算了,必须分两次循环进行,同样一定要在累积时加一个是否为0的判断

1010 Radix (25分)

有点意思,一开始被can this equation 6 = 110 be true? The answer is yes, if 6 is a decimal number and 110 is a binary number.,给我搞蒙了,这句话的意思是二进制的6等于110,然而我理解成了十进制的6和二进制的110是一样的。但是本质的问题就是给你一个数N1和它的进制,让你去找另外一个数N2是哪种进制时和N1相等。其实已经暗示了边界值,最大的进制应该是N1。

1011 World Cup Betting (20分)

没什么东西,按部就班的按照题意来就行。

1012 The Best Rank (25分)

把所有的数据存成结构体按部就班的排序即可,不过要注意的是对于一个科目中相同分数的排序应该是1、1、3、4、5,而不是1、1、2、3、4,所有排序后在相等时的rank等于上一个分数的rank。此外题目中说The priorities of the ranking methods are ordered as A > C > M > E.,所以储存时就按ACME的顺序存储会省很多事。

1013 Battle Over Cities (25分)

意思就是给出n个城市之间有相互连接的m条道路,当删除一个城市和其连接的道路的时候,问其他几个剩余的城市至少要添加多少个路线才能让它们重新变为连通图。
添加的最少的路线,就是他们的连通分量数-1,因为当a个互相分立的连通分量需要变为连通图的时候,只需要添加a-1个路线,就能让他们相连。所以这道题就是求去除了某个结点之后其他的图所拥有的连通分量数。
使用邻接矩阵存储,对于每一个被占领的城市,去除这个城市结点,就是把它标记为已经访问过,这样在深度优先遍历的时候,对于所有未访问的结点进行遍历,就能求到所有的连通分量的个数,记得每一次输入被占领的城市之前要把visit数组置为false(重置)

1014 Waiting in Line (30分)

题目真的长,要注意的是如果一个客户在17:00以及以后还没有开始服务就不再服务输出sorry;如果这个服务已经开始了,无论时间多长都要等他服务完毕。所以对于当前要进入黄线的人的服务结束时间的计算应当放在判断黄线前最后一个人的结束时间是否超过17:00,如果超过就可以sorry了。此外,初始化是对前n*m个客户进行的,之后就会不停判断哪个窗口最先有空位,然后等待序列中的第一个客户进入空位,直到所有客户入队。
注意这里为了判断结束方便才让所有客户入队,并不是所有客户都能得到服务。

1015 Reversible Primes (20分)

别只顾着转换后的数,原来的数也必须是素数。还有0和1不是质数。

1016 Phone Bills (25分)

是真的麻烦,关键是题意的理解,给出的24小时中每个小时里每分钟的费用是多少美分,输出的是美元,我吐了。
所以在计算费用时:

//计算费用,这里默认输入的是a比b大,rate中存放的是每小时美分数
double calculateCost(Record a,Record b,int rate[])
{double result=0.0;int sum_day=0;//打一整天费用for(int i=0;i<24;i++){sum_day+=rate[i]*0.01*60;}//天数result+=(a.dd-b.dd)*sum_day;//小时if(a.hh>b.hh){for(int i=b.hh;i<a.hh;i++){result+=rate[i]*0.01*60;}}else{for(int i=a.hh;i<b.hh;i++){result-=rate[i]*0.01*60;}}//分钟 result-=b.mm*rate[b.hh]*0.01;//多的减去result+=a.mm*rate[a.hh]*0.01;//少的加上return result;
}

1017. Queueing at Bank (25)

用一个结构体存储客户的到达时间和办理业务时间~首先把所有hh:mm:ss格式的时间全化成以当天0点为基准的秒数。注意晚于17:00的客户不算在内,因为我们同时存了到达时间和办理时间,所以下一个客户的等待时间就是他到来的时间减去上一个客户办理结束的时间(在前者小于后者的前提下)。我们可以把每个客户办理完的时间放入优先队列中,这样我们甚至不需要管每个窗口怎么样,直接一直用队首(上一个客户办理结束的时间)和下一个客户到来的时间比即可,如果前者大,那么就需要计算等待时间,如果前者小或二者相等,那么只用把其结束时间放入队列中。

1018 Public Bike Management (30分)

Dijkstra + DFS。如果只有Dijkstra是不可以的,因为minNeed和minBack在路径上的传递不满足最优子结构,不是简单的相加的过程,只有在所有路径都确定了之后才能区选择最小的need和最小的back~
Dijkstra求最短路径,dfs求minNeed和minBack和path,dfs的时候模拟一遍需要调整的过程,求出最后得到的need和back,与minNeed和minBack比较然后根据情况更新path,最后输出minNeed path 和 minBack

1019 General Palindromic Number (20分)

进制转化罢了,注意0的特殊情况。

1020 Tree Traversals (25分)

分析:与后序中序转换为前序的代码相仿(无须构造二叉树再进行广度优先搜索),只不过加一个变量index,表示当前的根结点在二叉树中所对应的下标(从0开始),所以进行一次输出先序的递归过程中,就可以把根结点下标index及所对应的值存储在map<int, int> level中,map是有序的会根据index从小到大自动排序,这样递归完成后level中的值就是层序遍历的顺序

1021 Deepest Root (25分)

使用DFS即可判断图是否连通以及有几个连通子图,即为No时的components数。
在深度优先遍历时加一个深度值,分别以所有节点为源DFS图,即可得所有节点深度值。

1022 Digital Library (30分)

除了id以外我们都用map<string, set>,检索的信息作为关键字,id作为元素。这样方便输出,还有在进行检索时我们可以先用map的find方法找对应的检索项是否存在,再去找对应id,提高效率。
此外在输入关键词时我们不知道到底有几个关键词,可以:

     while(cin >> key) {Key[key].insert(id);char c = getchar();if(c == '\n') break;}

1023 Have Fun with Numbers (20分)

不止为何第四个测试点出错。

1024 Palindromic Number (25分)

用字符串或者数组存数比较方便且不会有超出的int范围的危险,可以随意的逆序,没什么难的,按照题目进行即可。

1025 PAT Ranking (25分)

没什么可花里胡哨的,分别存每个local的成绩和所有的成绩,各自排序即可,值得注意的是相同分数排名相同,也就是如1 2 2 4 5 5 7。我是这样处理的:

//为总成绩排名 fr是final_ranksort(final,final+index,cmp);int rank=1;final[0].fr=rank;for(int i=1;i<index;i++){if(final[i].score==final[i-1].score){final[i].fr=final[i-1].fr;rank++;}else{rank++;final[i].fr=rank;}}

1026 Table Tennis (30分)

为每个桌子都建立一个存有上一对玩家开始和结束时间的结构体。循环所有玩家(玩家也存在于按达到时间排好序的结构体数组中),每次循环找到最早空闲的桌子:
如果最早空闲的桌子index是vip桌,那么寻找队列里面第一个vip球员。根据他的到达时间继续分类讨论。
如果最早空闲的桌子index不是vip桌,那么看队首的球员是不是vip球员。如果是普通人,就直接把球桌分配给他,如果是vip,那么需要找到最早空闲的vip桌子的号vipindex,根据vip球员的到达时间和vipindex桌子的空闲时间继续分类讨论。

1027 Colors in Mars (20分)

10进制转其他进制,因为还有ABC,用string存结果更方便,还可以用其insert方法很方便的从左侧插入。

1028 List Sorting (25分)

正常的用sort对结构体排序即可,只不过有一个细节:and if C = 3 then the records must be sorted in non-decreasing order according to grades. 也就是C=3时我们比的是成绩,是non-decreasing order,也就是非递减,所以比较器中是:
return a.grade<=b.grade;

1029 Median (25分)

简单的归并,不过要注意避免超时(循环到mid处即可停止),不用非得到整个合并后的序列,那样会超时。

1030 Travel Plan (30分)

完完全全的Dijkstra算法,只不过多了最短路径相同时比较费用的操作。

1031 Hello World for U (20分)

n​1=n3, n1+n2+n3−2=N,由此可得U的三个边的个数以及中间的空格数。

1032 Sharing (25分)

把链表存在以Address为下标Data、Next、flag(标记是否出现)为内容的结构体数组中。遍历第一条链表,将访问过的结点的flag都标记为true,当遍历第二条结点的时候,如果遇到了true的结点就输出并结束程序,没有遇到就输出-1

1033 To Fill or Not to Fill (25分)

贪心思想:
0.寻找比自己距离远的,到能够到达的最大距离之间的加油站,看他们的油价。如果找到了更低价格的油价,就加油到刚好能到达那个加油站的距离的油,然后去那个更低价格的加油站(有更低的我一分都不想多花在别的距离上,只加到刚好满足更低价格的加油站的距离就行,那样以后的路程我就可以以更低的价格行驶啦)
1.如果找不到更低的,就找尽可能低的油价的加油站,在当前加油站加满油之后过去。因为想要让路程上使用的尽可能是低价的油,既然没有比当前更低价格的了,就让油箱加到最大值,这样能保证利益最大化,保证最大的距离使用的是便宜的油。

1034 Head of a Gang (30分)

说白了就是找给出的数据中有多少节点大于2的连通图,并且找到权重最大的当头头,显然要用到DFS,但这里怎么储存数据才是值得思考的问题,显然这里用path[]存太不方便了,我们完全可以对所有未访问节点进行DFS,每次找到他所在团体的头头即可。

1035 Password (20分)

按照replace 1 (one) by @, 0 (zero) by %, l by L, and O by o.即可

1036 Boys vs Girls (25分)

分成男女两个容器排序按题意输出即可。

1037 Magic Coupon (25分)

把输入分成正负两部分,并排序,因为每个只能用一次,对应相乘即可。

1038 Recover the Smallest Number (30分)

所有的字符串合起来最小无非就是让每两个字符串构成的数字是最小,由此为字符串数组排序即可,比较器中的条件就是return a + b < b + a;

1039 Course List for Student (25分)

为学生配置结构体而不是为课程配置,这样边输入就可以边记录,最后按顺序输出即可。

1040 Longest Symmetric String (25分)

因为字符串长度小于1000,没必要用动态规划,直接从头遍历即可,不过坑人的点在于最短的回文子串的长度为1,也就是一个字母也是回文子串,太坑了。

1041 Be Unique (20分)

用一个数组计数即可,第一个个数等于1的就是要找的。

1042 Shuffling Machine (20分)

就是让我们洗牌,用两个相同的字符串数组一个存结果一个用来赋值即可。

1043 Is It a Binary Search Tree (25分)

典型的二叉搜索树的遍历问题,插入函数构建二叉搜索树、前序遍历、后序遍历,值得注意的是If we swap the left and right subtrees of every node, then the resulting tree is called the Mirror Image of a BST. 也就是每个节点的左右节点颠倒了也是BST,所以既可以构建两棵树,也可以选择前序遍历时给出两种遍历方式。

1044 Shopping in Mars (25分)

从第一个开始遍历其后的所有数即可。对于每个数有一个总和,分为大于小于等于三种情况处理。

1045 Favorite Color Stripe (30分)

因为喜欢的颜色是不重复的,把喜欢的颜色的序列按照存储到数组中,book[i] = j表示i颜色的下标为j。先在输入的时候剔除不在喜欢的序列中的元素,然后把剩余的保存在数组a中。按照最长不下降子序列的方式做,对于从前到后的每一个i,如果它前面的所有的j,一下子找到了一个j的下标book[j]比book[i]小,此时就更新dp[i]使它 = max(dp[i], dp[j] + 1);并且同时再每一次遍历完成一次j后更新maxn的值为长度的最大值,最后输出maxn

1046 Shortest Distance (20分)

如果单纯的根据输入累加,再用总体减去累加的比较二者大小,会出现最后一个测试点超时,所以累加这一步完全可以在输入中进行,我们让数组不存相邻两个点的距离,而是存第一个点到每个点的距离。这样再去求两个点的最短距离就变成了比较他们从两个方向到第一个点距离差的最小值。

1047 Student List for Course (25分)

printf("%s\n",Class[i][j].c_str());的形式输出字符串,否则会超时。

1048 Find Coins (25分)

首先排除输入中大于M的数,再排序,l、r指向两端向中间加就行了,每次根据加和的值与M的大小关系做不同的处理。

1049 Counting Ones (30分)

第一次用字符串硬遍历计数结果对,但果不其然的超时了,想偷懒都偷不成,所以还要仔细琢磨,其实我们完全可以对N的每一位的之前和之后的数字个数来推断1到N个数中1的个数:

从第一位(个位)到最高位,设now为当前位的数字,left为now左边的所有数字构成的数字,right是now右边的所有数字构成的数字。只需要一次次累加对于当前位now来说可能出现1的个数,然后把它们累加即可。a表示当前的个位为1,十位为10,百位为100类推。
对于now,有三种情况:
1.now == 0 : 那么 ans += left * a; //因为now==0说明now位只有在left从0~left-1的时候会产生1,所以会产生left次,但是又因为右边会重复从0-999…出现a次
2.now == 1 : ans += left * a + right + 1;//now = 1的时候就要比上一步多加一个当now为1的时候右边出现0~right个数导致的now为1的次数
3.now >= 2 : ans += (left + 1) * a;//now大于等于2就左边0~left的时候会在now位置产生1,所以会产生left次,但是又因为右边会重复从0-999…出现a次

1050 String Subtraction (20分)

用一个数组标记s2中的所有字符即可,输出s1中s2中没有的。

1051 Pop Sequence (25分)

这里必须要巧妙地利用堆栈的性质,因为冒泡排序是从上到下比较并交换,而输入到堆栈的顺序是从小到大,所以只要在将输入插入堆栈的过程中找到对应冒泡排序的元素是否和栈顶元素相同,相同就说明可能是冒泡中的某个过程,一直重复直到最后一个入栈的值。

1052 Linked List Sorting (25分)

坑的地方就在于输入中可能有结点并不是链表中的结点,这也是为什么让我们输出结点个数,我们可以在存有地址、key、next的结构体中加一个判断是否为链表中结点的变量,然后以地址为下标,输入完后从头结点的地址开始遍历下一个结点,凡是遍历到的,那个变量就是true。之后可以排除false的节点,也可以让true的都排在前面,再对key排序。

1053 Path of Equal Weight (30分)

DFS就可以,只不过路径存的是权重,并且在输入时就对所有子节点的排序(这样就自然符合题目要求的顺序了),当和等于S时即可输出。此外注意The weight of a path from R to L is defined to be the sum of the weights of all the nodes along the path from R to any leaf node L.也就是必须从根节点到某个叶子结点和为S.

1054 The Dominant Color (20分)

计数即可,输出超过一半的那个。

1055 The World’s Richest (25分)

把信息存在结构体中,先对所有的人排序在遍历所有查找要求进行查找,并且在达到最大输入时停止查找,这样才不会超时。

1056 Mice and Rice (25分)

这题有点恶心,因为看例子也可以看出如果上一次层级不止一个,那么下一层级的排序就要加一个。所以我们对于第一名之前的每层排序都等于层数+1(第一名那一层也不会进入循环)即可。

1057 Stack (30分)

直接排序会超时,可以用树状数组存储,查找第k = (s.size() + 1) / 2大的数即可,关于树状数组的讲解可看https://www.cnblogs.com/xenny/p/9739600.html

1058 A+B in Hogwarts (20分)

根据题意进位即可。

1059 Prime Factors (25分)

坑点在于 N = 1的情况需要特判输出 1=1(测试点3),对于不止出现一次的素数用一个map标记对应素数个数即可。

1060 Are They Equal (25分)

首先一个坑就是输入的数字开头可能有0,要全部删去,此外科学技术法必须小数点后为非0数(the number in the standard form 0.d[1]…d[N]*10^k (d[1]>0 unless the number is 0)),也就是0.0012*10^0必须写成0.12*10^-2。本身题目并不难,但是这些细节比较多。

1061 Dating (20分)

按题目要求遍历字符串找即可,注意星期是A-G,并且小时和分钟都必须是两位数形式。

1062 Talent and Virtue (25分)

按题目要求用结构体数组分别存那四类人并排序即可。值得注意的是Those with both grades below H, but with virtue not lower than talent are considered as the “fool men”. 所以只要在两者都小于H时virtue不低于talent时为fool man。条件别写错了。

1063 Set Similarity (25分)

相似率是由二者共同拥有的数的个数除以二者共同拥有的不重复的数的个数得到,所以我们可以直接用set或者map存储,遍历查询的两个集合的其中一个,看看能不能用find成员函数找到,找到了说明属于二者共同拥有的数的个数,找不到属于二者共同拥有的不重复的数的个数。

1064 Complete Binary Search Tree (30分)

这道题看似在让我们实现完全二叉搜索树再去层序遍历,但那太麻烦了,我们做题应该先思考目的,他要我们求层序遍历的结果,根据二分查找树的性质,其中序遍历(左根右)的结果恰好就会有序的,所以只要对输入排序即得中序遍历的结果,并且我们已知这是一个从上到下从左到右的完全二叉树,完全二叉搜索树成了我们的条件,这样我们可以效仿输出中序遍历结果那样,把中序遍历的结果按左中右顺序存入层序遍历的结果中即可。

1065 A+B and C (64bit) (20分)

所有的输入都是在[−2​6,2​63]之间,恰好是long long类型的表示范围,如果赶上2​63+2​63那么就是264,会溢出,此时如果赋值这个和给一个longlong类型的变量,会溢出到负数部分,同理负数也会溢出到正数部分,我们只需要单独处理这两种情况即可。

1066 Root of AVL Tree (25分)

完全就是考你对平衡二叉搜索树的掌握,直接看:
https://blog.csdn.net/derbi123123/article/details/106629378
https://blog.csdn.net/derbi123123/article/details/104204220

1067 Sort with Swap(0, i) (25分)

这里我们把输入作为数组下标,数组元素为其位置,然后让元素0一直和以其对应下标的数的数组元素交换直到0下标对应元素0,再看其他的不符合下标与元素相同的,直到所有的数都和下标相同,每次交换都让计数变量++即可。

1068 Find More Coins (30分)

典型的背包问题,这里我逆序遍历来填充动态数组的值,这样输出时从最后一个元素输出直到值为m时停止就恰好是最小的序列。

1069 The Black Hole of Numbers (20分)

按照题目的意思来就行了,有几个坑,一是当输入为6174时也要输出7641 - 1467 = 6174,二是必须把N - N = 0000作为循环终止的条件,而不能在循环中以此终止,否则测试点0会出错,不知为何。

1070 Mooncake (25分)

说白了就是让你算单价,然后对单价排序,一直求和直到最大需求。有一个坑就是第二个测试点,经过我的尝试,只要把月饼数量也改成浮点类型就可以了,因为毕竟单位是千,出现小数很正常。

1071 Speech Patterns (25分)

说来说去就是这句话Here a “word” is defined as a continuous sequence of alphanumerical characters separated by non-alphanumerical characters or the line beginning/end.,就是说一个单词被定义为一个被非字母数字分割由字母数字组成的序列,也就是说只要被分割出来的都是单词,用map计数即可,也正好符合题目的顺序要求。

1072 Gas Station (30分)

其实就是说从m个加油站里面选取1个站点,让他离居民区的最近的房子最远,并且没有任何房子到其最短距离超出服务范围Ds之内。只要对所有的加油站Dijkstra算法即可:在对所有加油站的循环中得到所有房子到当前加油站的最小距离,进而找到离当前加油站最近的房子并求平均值,最后比较即可。

1073 Scientific Notation (20分)

按小数点和E对输入进行分段并逐段处理即可。

1074 Reversing Linked List (25分)

说白了只要逆转了地址自然而然就可以得到其他的数据,从head开始循环直到-1把地址顺序的存在数组中,然后按要求reverse即可。根本不需要建立真正的链表。

1075 PAT Judge (25分)

按要求把需要的数据都放在结构体中即可,只不过内容比较多,一个要求一个要求的实现即可。

1076 Forwards on Weibo (30分)

说白了就是看一个人发的微博最多有多少个赞,他发的微博可以被至多L层的粉丝看见,显然要用深度优先遍历,求层数的同时还能统计L层内的粉丝数,只不过输入是where M[i] (≤100) is the total number of people that user[i] follows; and user_list[i] is a list of the M[i] users that followed by user[i]. 输入的是这个人关注的人,而不是他的粉丝,不要想当然的理解错。

1077 Kuchiguse (20分)

与其费尽心思的找最后一个单词,倒不如从第一行输入开始找相同项,如果相同项为空则输出nai,否则输出相同项。别忘了逆序找。

1078 Hashing (25分)

Quadratic probing (with positive increments only) is used to solve the collisions.题目让我们使用平方探测法处理冲突,并且只需要考虑正数。平方探测法就是对于每个数都用其本身加上从1到size的平方再%size。

1079 Total Sales of Supply Chain (25分)

还是对题意的理解比较关键:给一棵树,在树根出货物的价格为p,然后从根结点开始每往下走一层,该层的货物价格将会在父亲结点的价格上增加r%,给出每个叶结点的货物量,求他们的价格之和。用BFS和DFS都可以,每到叶子结点就加和即可。

1080 Graduate Admission (30分)

英文水平是硬伤。。。。
题目大概的意思:
浙江省的研究生学院每年的申请按照两个分数的规则优先录取,对于每个学生排名越靠前越可以先按照他的意愿选择学校。关键在于If there is a tied rank, and if the corresponding applicants are applying to the same school, then that school must admit all the applicants with the same rank, even if its quota will be exceeded.
也就是说在有相同排名的学生选中了一所学校,即使同时录取这些学生会导致名额超限,也会录取他们。因此在程序中,我们需要有一个单独的数组记录每个学校最后录取的人的排名,在超限时进行判断,如果排名相同仍录取,其他的按照题目要求进行即可。

1081 Rational Sum (20分)

就是单纯的考察最大公因数和最小公倍数的计算:

int HFC(long int a,long int b)
{if(b==0)return a;elsereturn HFC(b,a%b);
}
int LCM(long int a,long int b)
{return a*b/HFC(a,b);
}

1082 Read Number in Chinese (25分)

关键在于是否在非零数字前输出合适的ling,如果N除以10的对应位数次方大于10的话,说明就要在非零数字前输出ling了。
还有就是对0-9、位数、10的对应位数的表示:

string num[10] = { "ling","yi", "er", "san", "si", "wu", "liu", "qi", "ba", "jiu" };
string c[6] = { "Ge","Shi", "Bai", "Qian", "Yi", "Wan" };
int J[] = {1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000};

1083 List Grades (25分)

先对所有输入排序再输出区间内的人名和id即可。

1084 Broken Keyboard (20分)

用map标记第二行输入中的所有字符(小写字母统一为大写),在看第一行中哪些字符为被标记,输出即可。

1085 Perfect Sequence (25分)

先排序,然后从头遍历,每次都从上次开始元素的结束元素开始,当满足条件的个数大于总数减去当前元素下标时即可停止。这样就足够节省时间了。

1086 Tree Traversals Again (25分)

栈实现的是二叉树的中序遍历(左根右),而每次push入值的顺序是二叉树的前序遍历(根左右),所以该题可以用二叉树前序和中序转后序的方法做。

void postorder(int root, int start, int end)
{if (start > end) return;int i = start;while (i < end && in[i] != pre[root]) i++;postorder(root + 1, start, i - 1);postorder(root + 1 + i - start, i + 1, end);post.push_back(pre[root]);
}

此外,题目中并未说没有相同元素,所以我们应该用栈操作索引(下标)而不是真正的元素,元素单独存在一个数组中,求出后序遍历的索引顺序后在以其为下标输出元素数组即可。

1087 All Roads Lead to Rome (30分)

这题是真的全乎,把图中所有能涉及的数据都涉及了,但是还用Dijkstra就足够了,只不过要加许多题目中涉及的点权、路径数、路径中节点数。对于cost和happiness都相同的路径要比平均happiness,在Dijkstra中做比较不好想(也可以),可以单独用深度优先遍历做,方便计数也可以直接得最大值。

1088 Rational Arithmetic (20分)

还是用到最大公因数和最小公倍数,就是麻烦点,什么情况都要考虑到。

1089 Insert or Merge (25分)

用非递归的归并排序比较方便,在每一步排序后都去判断是否与输入相同,因为要我们输出下一步,所以相同则continue并标记找到了,在下一步排序中进行输出。

1090 Highest Price in Supply Chain (25分)

递归的深度优先遍历即可,可以只记录所在层次,最后再计算价格,价格必须多乘一次,因为问的是从价格最高的人手中买的价格。

1091 Acute Stroke (30分)

三维(M×N×L)的广度优先搜索,XYZ三个数组判断方向,对每一个点广度优先累计肿瘤块的大小,如果大于等于t就把结果累加,关键在于标记被访问过和是否越界。

1092 To Buy or Not to Buy (20分)

用map计数,并在比较时加上标记即可。

1093 Count PAT’s (25分)

题目很简单,和一类数学题很相似,每个A前P的个数乘以其后的T的个数累加即可,坑点在于Since the result may be a huge number, you only have to output the result moded by 1000000007.这个对1000000007取模是每次累加都要进行的。大概是因为累积类似于排列组合,算出来的数很大所以取余输出。

1094 The Largest Generation (25分)

广度优先遍历记录每层人个数即可。

1095 Cars on Campus (30分)

把时间转化为以秒为单位用结构体存储数据即可,坑的在于Each in record is paired with the chronologically next record for the same car provided it is an out record. Any in records that are not paired with an out record are ignored, as are out records not paired with an in record.也就是说如果有多次进入未出,那么取最后一个in,如果有多次出而无入,取第一个out

1096 Consecutive Factors (20分)

因为连乘最多也就N的开平方次(后面的数差距更大不可能连续),所以我们可以从2开始,双重遍历,每次从第一层的数开始,记录最大值和终止值即可。对于没有连续值的输出1和它本身即可。

1097 Deduplication on a Linked List (25分)

用地址做下标用结构体存即可,从head遍历next为输入排序,按照绝对值做标记将输入分成两个容器存储即可。

1098 Insertion or Heap Sort (25分)

堆排序是每次都把最大值放到未排序元素的最后,且未排序元素的最大值一直在堆顶,所以堆排序的后面一定是有序的,例如题目给出的6 4 5 1 0 3 2 7 8 9,正符合堆排序的要求,然后对6下滤即可,根本不用去写堆排序的完整过程。

1099 Build A Binary Search Tree (30分)

既然要求我们输出层序遍历的结果,而我们又恰好能从输入中进行排序得到中序遍历的结果,我们还知道树的结构,完全可以直接深度优先遍历把树的层级、各点数据都遍历出来,然后对层级和数据进行排序输出即可。

1100 Mars Numbers (20分)

坑点就在于火星文的判断上,输入长度不是3就是7,然而用3判断会出错,必须用4.。

1101 Quick Sort (25分)

测试点2跟个鬼一样,如果输入是逆序会没有pivot,也就是会输出零,而且输出完零之后下一行必须还输出一个空行。。。。

1102 Invert a Binary Tree (25分)

说白了就是实现一个镜像的二叉树,只要在一开始构造的时候就左右孩子相反的存储即可,然后用广度优先遍历和中序遍历输出即可。

1103 Integer Factorization (30分)

典型的深度优先搜索的问题,典型的不能再典型了,并且是不限制单一元素选择次数,所以可以从后往前递归,可能的Factor只有1到N开P次方,所以在DFS中选与不选一直累加并与N比较即可,顺带比较最大序列和。

1104 Sum of Number Segments (20分)

最先用的方法是把所有的和序列分成:
(0.1) (0.1, 0.2) (0.1, 0.2, 0.3) (0.1, 0.2, 0.3, 0.4),
(0.2) (0.2, 0.3) (0.2, 0.3, 0.4)
(0.3) (0.3, 0.4)
(0.4).
可以发现每层都比上一层少N-i个第一个数,递归求和即可,但是这样测试点2就会出错,在百度上搜了搜,说溢出和浮点类型计算误差的比较多,确实用递归或者一步步加要比直接用规律加的次数多,可能误差更大,所以还是规律:

sum += num[i] * i * (n - i + 1);

但是仅这样做还是不对,我们可以把输入的double类型的值扩大1000倍后转为long long整型累加,同时使用long long类型保存sum的值,输出时除以1000.0转为浮点型再输出(相当于把小数点向后移动3位后再计算,避免double类型的小数部分存储不精确,多次累加后对结果产生影响)

sum += (long long)(temp * 1000) * i * (n - i + 1);

1105 Spiral Matrix (25分)

计算矩阵行列数差最小的行列数从N开平方开始找即可,需要画一个比较大的图比如5*5的去找外层循环(每个外圈(可以用行数/2+行数%2得到))和内层循环(每个外圈的四个边)的规律,然后将排好序的序列依次放入即可。

1106 Lowest Price in Supply Chain (25分)

广度优先遍历计算每个节点的层数即可,输出层数最大的个数和价钱。

1107 Social Clusters (30分)

深度优先遍历找连通图个数即可。

1108 Finding Average (20分)

以"." 和 "-"作为划分依据根据题目中条件进行判断即可。

1109 Group Photo (25分)

先对所有人进行身高和名字的排序,然后依次从该排身高最高的人开始放入每排中间,然后每隔一个放入不同侧即可,这样就满足两边低中间高了。

1110 Complete Binary Tree (25分)

对于左右节点不存在的记为-1,深度优先遍历记录树的层序遍历的结果,如果前N个数中出现-1说明不是完全二叉树。

1111 Online Map (30分)

没什么好的办法,分别对最短距离和最快时间用dijkrtra算法求解即可。

1112 Stucked Keyboard (20分)

这道题不能只按题目中的去想,题目中只说了之前是坏键的后来可以不是,但没说之前判定为没坏的后来坏了怎么办,这种情况也是认为没坏。比如aabbbaaa中a应给算是不坏。注意这个坑。

1113 Integer Set Partition (25分)

这题。。。。。。

1114 Family Property (25分)

把关系都存成图,深度优先遍历找所有连通图即可,数据较多需细致。

1115 Counting Nodes in a BST (30分)

构建二叉搜索树时记录每个节点层数和树的最大层数,然后层序遍历记录最大层和倒数第二层的数量即可。

1116 Come on! Let’s C (20分)

根据题意写即可。

1117 Eddington Number (25分)

既然题目要求的输入是N天中每天骑行距离,而Eddington Number是连续E天骑行E公里以上,所以我们不妨对骑行距离正向排序,骑行天数逆向排序,以题中案例为例:
骑行距离:2 3 6 6 7 7 8 8 9 10
天数:10 9 8 7 6 5 4 3 2 1
找到第一个骑行距离大于天数的位置即可。当然不能忘了0天0公里的情况。

1118 Birds in Forest (25分)

用图做深度优先遍历找连通图数并记录每个连通图中图片下标的话会超时,而且这题是明显的并查集。

1119 Pre- and Post-order Traversals (30分)

让我们由先序遍历和后序遍历求可能的中序遍历,但是大家都知道这是不确定的,因为我们无法知道左右孩子的位置关系(先序根左右,后序左右根,左右孩顺序一样),这也是突破点,我们知道的是先序的第一个和后序的最后一个应该相同,所以在递归处理时,每当找到的下一个根节点和当前根节点相邻时说明左右无法确定,是不唯一的,可以随意取一个方向。

1120 Friend Numbers (20分)

用set存加和的结果输出即可。

1121 Damn Single (25分)

用数组记录每个人的伴侣,伴侣不在或者没有伴侣的均为single,按五位格式输出!!!

1122 Hamiltonian Cycle (25分)

只有首尾元素相同且中间元素只出现一次的才有可能是连通图,满足这一条件的看从头到尾是不是每相邻两个元素都直接相连即可。

1123 Is It a Complete AVL Tree (30分)

还是要用正常的AVL树的方法建树。。。要判断一个二叉树是不是完全二叉树,只要看第一次出现空节点后是否还有非空节点在其后即可(做个标记判断即可)。

1124 Raffle for Weibo Followers (20分)

用map标记即可,每次都是从上一次没获奖的那个人开始加。

1125 Chain the Ropes (25分)

每次把两个绳子折叠套在一起,从最短的开始可以让损失最小。

1126 Eulerian Path (25分)

在对每个节点的度进行奇偶的判断前,先要用DFS看看是不是连通图。

1127 ZigZagging on a Tree (30分)

由中序和后序还原出二叉树之后,层序遍历把结果放在以层数为一维下标的二维容器中,输出时偶数层(根节点为第一层)逆序输出即可。

1128 N Queens Puzzle (20分)

在每列所在行号输入后都与该列行号前所在行所有的列和对角线元素比较即可。

1129 Recommendation System (25分)

用set存储包含物品索引及出现次数,重载’<'即可自动按题目顺序。

1130 Infix Expression (25分)

对输入进行深度优先遍历,分别处理四种情况:

  1. 左右子树都空 返回 “(” + 根 + “)”
  2. 左空右不空 返回 “(” + 根 + 右子树 + “)”
  3. 左不空右空 这种情况不存在
  4. 左右都不空 返回 “(” + 左子树 + 根 + 右子树 + “)”

递归最外层可能会被括号包起来,也可能不被包起来。要判断一下,如果被包起来,把最外层括号去掉即可。

1131 Subway Map (30分)

找路径用DFS就足够了,难点就在于如何判断中转站,因为中转站会存在于多条路线上,所以与其去想着怎么存中转站都经历了那些路线,倒不如直接存每两个相邻节点所在线路,这是唯一的,想明白这里就很容易了。至于怎么知道当前在中转站,只需要每次都保留上一次所在线路,如果线路变了,那么就是中转站。

1132 Cut Integer (20分)

字符串。

1133 Splitting A Linked List (25分)

按分类要求分成三个类存储,最后再存入一个容器中输出即可。

1134 Vertex Cover (25分)

用邻接表存储,进行标记,看是否所有点都出现过即可。

1135 Is It A Red-Black Tree (30分)

判断以下几点:
1.根结点是否为黑色
2.如果一个结点是红色,它的孩子节点是否都为黑色
3.从任意结点到叶子结点的路径中,黑色结点的个数是否相同
所以分为以下几步:

  1. 根据先序建立一棵树,用链表表示
  2. 判断根结点(题目所给先序的第一个点即根结点)是否是黑色
  3. 根据建立的树,从根结点开始遍历,如果当前结点是红色,判断它的孩子节点是否为黑色,递归返回结果
  4. 从根节点开始,递归遍历,检查每个结点的左子树的高度和右子树的高度(这里的高度指黑色结点的个数),比较左右孩子高度是否相等,递归返回结果

1136 A Delayed Palindrome (20分)

因为最大位为1000,只能自己写加法器了。

1137 Final Grading (25分)

按题目要求在结构体数组中存储数据再排序即可。

1138 Postorder Traversal (25分)

只要求输出后序的第一个没必要建树,一定要充分利用二叉搜索树三种遍历的关系,分三种情况讨论

  1. 就一个根结点,直接输出
  2. 在右子树,根结点的位置都在第一个,遍历两个序列不一样的,中序的位置既是后序第一个,全部一样就输出最后一个
  3. 在左子树,直接输出先序左子树最后一个

1139 First Contact (30分)

从一头找不如从两头找。
就相当于三层关系,找中间层有联系的,只不过有几点需要注意:
1、如果用int读入每个人的编号,-0000与0000无法分别性别。
2、在遍历a与b的朋友的时候,一定要排除a与b本身互为朋友的情况!

1140 Look-and-say Sequence (20分)

用两个容器,一个用来存下一步的值,一个用来提供上一步的数据即可。

1141 PAT Ranking of Institutions (25分)

按要求用结构体存学校信息即可,注意学校的总分是排序前再取int类型。

1142 Maximal Clique (25分)

在每个需要检查的序列中,首先判断是否都两两相连,如果不是直接Not a Clique,如果是就要看序列中每个点的邻接点是否有与序列中其他点均直接相连的,如果有就是Not Maximal,否则就是Yes。

1143 Lowest Common Ancestor (30分)

同样不需要建树,要巧妙利用二叉搜树的性质!!!用map<int, bool> mp来标记树中所有出现过的结点,遍历一遍pre数组,将当前结点标记为a,如果u和v分别在a的左、右,或者u、v其中一个就是当前a,说明找到了这个共同最低祖先a,退出当前循环,最后根据要求输出结果即可。

1144 The Missing Number (20分)

排序后逐个判断即可。不要遗漏输入全是负数或0的情况

1145 Hashing - Average Search Time (25分)

用平方探测法找每个数的位置即可,查询时仍是按散列查询不是遍历查,注意这个。

1146 Topological Order (25分)

用入度来做即可,每次检查一个给定序列的某个元素时,都让入度-1,直到最后一个元素,如果途中出现了入度不为0的元素就说明不是拓扑序。

1147 Heaps (30分)

判断堆很容易,看看每个数是否破坏规则即可,后序遍历按照下标*2、*2+1、父节点来即可。

1148 Werewolf - Simple Version (20分)

每个人说的数字保存在v数组中,i从1~n、j从i+1~n遍历,分别假设i和j是狼人,a数组表示该人是狼人还是好人,等于1表示是好人,等于-1表示是狼人。k从1~n分别判断k所说的话是真是假,k说的话和真实情况不同(即v[k] * a[abs(v[k])] < 0)则表示k在说谎,则将k放在lie数组中;遍历完成后判断lie数组,如果说谎人数等于2并且这两个说谎的人一个是好人一个是狼人(即a[lie[0]] + a[lie[1]] == 0)表示满足题意,此时输出i和j并return,否则最后的时候输出No Solution~

1149 Dangerous Goods Packaging (25分)

存成邻接表遍历每一个输入的被检查物体的不相容物体,看是否在之后出现过。

1150 Travelling Salesman Problem (25分)

如果给出的路径存在某两个连续的点不可达或者第一个结点和最后一个结点不同或者这个路径没有访问过图中所有的点,那么它就不是一个旅行商环路(flag = 0)~如果满足了旅行商环路的条件,那么再判断这个旅行商环路是否是简单旅行商环路,即是否访问过n+1个结点(源点访问两次)~最后输出这些旅行商环路中经过的路径最短的路径编号和路径长度

1151 LCA in a Binary Tree (30分)

不用建树~已知某个树的根结点,若a和b在根结点的左边,则a和b的最近公共祖先在当前子树根结点的左子树寻找,如果a和b在当前子树根结点的两边,在当前子树的根结点就是a和b的最近公共祖先,如果a和b在当前子树根结点的右边,则a和b的最近公共祖先就在当前子树的右子树寻找。中序加先序可以唯一确定一棵树,在不构建树的情况下,在每一层的递归中,可以得到树的根结点,在此时并入lca算法可以确定两个结点的公共祖先~

1152 Google Recruitment (20分)

从头开始到L-K,一直取K个数转换为整形看是不是素数即可。

1153 Decode Registration Card of PAT (25分)

没有必要存所有信息,按照1、2、3的要求存对应信息即可,3的比较难处理,我们可以先用unordered_map存每个site的人数,再放入vector中排序,用map会超时。

1154 Vertex Coloring (25分)

用邻接表存储v[min(v1,v2)].push_back(max(v1,v2));,因为本来就是0-N-1有顺序的编号,所以我们可以只存每个点比他大的点,避免重复比较浪费时间。然后遍历邻接表看看有没有重复的颜色即可。

1155 Heap Paths (30分)

从右到左(先i*2+1i*2)存每个父节点的子节点,然后深度优先遍历,每次到没有子节点的节点时就输出,每次到父节点的最后一个子节点时就从路径中移除父节点。

tmd终于刷完一遍了。。。。。。

刷PAT甲级的各题思路、细节以及遇到的问题记录相关推荐

  1. C++常用函数(刷PAT甲级总结)

    判断素数 HDU1059 求一个数字的质因子之积时,只需要考虑小于等于根号n的质因子,但是最后剩下的可能还是个质数,所以要格外考虑下 bool isPrime(int x){if(x<=1)re ...

  2. 2019年12月PAT甲级 第三题 Summit(1166)题解

    题目 A summit (峰会) is a meeting of heads of state or government. Arranging the rest areas for the summ ...

  3. 2019年秋季PAT甲级考试真题及参考答案

    1160 (20 Forever dfs+回溯剪枝) 题目描述: "Forever number" is a positive integer A with K digits, s ...

  4. 【PAT】PAT甲级题库所有题解(持续更新中...)

    题解: 本文为导航页,一些希望刷PAT甲级的玩家可以来看看,我会持续更新所有题目的题解(取决于我做到哪儿了(doge)) 题号按照PAT官网给出的标注 题目: 链接 标签 1001 A+B Forma ...

  5. pat甲级考试报名费_PAT(甲级)2019年冬季考试 题解

    总结写在前头: 考了字符串.链表(伪链表).图.树.考点比较均衡. 本次考试难度还行,需要较扎实的数据结构底子,对于字符串处理的技巧有一定的要求. 说句题外话,字符串是个重点,主要因为很多人会忽视字符 ...

  6. 浙大PAT甲级1040

    浙大PAT甲级1040 原题 问题分析 原题 1040 Longest Symmetric String (25 分) Given a string, you are supposed to outp ...

  7. 2020年9月PAT甲级满分必备刷题技巧

    2020年7月的考试结束了,除了本次的考题更新,短期内不会更新. [7月题目的特点:首次线上考试,没出链表.树相关的模板题,第2到4题背景新颖,大大降低了抄袭历年代码的可能性,可以看作是线上考试的新趋 ...

  8. PAT甲级刷题记录-(AcWing)-(Day06树 8题)

    PAT甲级刷题记录-(AcWing)-(Day06树 8题) 课程来源AcWing 其中AcWing中的题目为翻译好的中文题目 今日刷题列表 1110 Complete Binary Tree 111 ...

  9. 小峰峰的pat甲级刷题记录1020

    小峰峰的pat甲级刷题记录1020 方法一:通过后序和中序序列构建树,再层序输出 #include<iostream> #include<vector> using names ...

最新文章

  1. Java面试题大全带答案 110道(持续更新)
  2. JUC多线程核心知识-思维导图
  3. Java7之线程池ForkJoinPool
  4. 运行Google CTemplate首页的例子遇到_CrtIsValidHeapPointer异常
  5. Java 线程池的原理与实现
  6. 阿里云服务器ECS按ctrl+alt+delete无法登录
  7. 为什么游戏开发者不玩游戏_什么是游戏开发?
  8. ant中table表格的多选框如何清空
  9. 树莓派 php mysql 中文_使用树莓派(raspberry pi)搭建网站(nginx+php+mysql+ddclient)
  10. mysql随机显示记录_mysql随机提取记录数的方法
  11. C语言编写一个掷骰子猜大小游戏,用C语言模拟一种掷骰子游戏
  12. 【Unity】插件TextAnimator 新手使用说明
  13. 二十一世纪大学英语读写教程学习笔记(原文)——1 - Secrets of A Students(优秀学生的秘密)
  14. Wed Dec 20 2019 00:00:00 GMT+0800 (中国标准时间) 时间转换
  15. linux bridge 抓包,Linux bridge hairpin mode
  16. 阿沐帮大家总结了自动化基本操作——selenium_常见技巧
  17. Win10下IE无法打开网页的解决办法
  18. 路由器连接猫服务器未响应,猫能连上路由器连不上怎么回事【解决方法】
  19. 使用Python做QQ机器人
  20. 石墨笔记,Ulysses和Effie哪个更适合学生?

热门文章

  1. 动态页面转pdf文件方法
  2. 转移到ios下载安卓_Move to iOS-转移到iOS(数据转移)app下载2.10.0 安卓官方版-将安卓设备的通讯录,照片,app购买记录等无差别转移到ios设备的软件西西软件下载...
  3. mbot机器人巡线程序_mbot app-mbot机器人手机控制app1.1.7 官方安卓客户端-东坡下载...
  4. 【已解决】华硕天选rtx2060安装Ubuntu20黑屏问题
  5. D. Boboniu Chats with Du(枚举+思维)Codeforces Round #664 (Div. 2)
  6. AEAI WX微信扩展框架技术手册
  7. java string转小数点_java string 小数点转long
  8. 前端vue3项目中百度地图的使用api及实例
  9. 黑客马拉松巅峰对决,展示Web3强大功能。
  10. SpringBoot学习之单点登录