![](https://img-blog.csdnimg.cn/20201014180756738.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
PTA
江xiao河
这个作者很懒,什么都没留下…
展开
-
A1012 The Best Rank (25)
方法一:本题本人采取的思路是利用堆排序和dp来确定任何一个分数的名次。结构体数组的规模是1000000,存储任何一个学号对应的成绩。结构体数组不排序,用下标作为id。名次的获得采用桶排序O(n)方法二:首先需要用结构体变量存储学生信息,然后计算每个学生各个科目的成绩排名,然后通过id查询最大的排名。 结构体应存储学生的id、四个科目的成绩,然后用sort排序,分别用不同的科目成绩...原创 2018-08-27 16:00:58 · 218 阅读 · 0 评论 -
1147 Heaps(30 分)
一次AC! 思路:后续遍历迭代,注意到可以在遍历过程中判断是最大最小堆或者不是堆即可。#include<iostream>#include<vector>using namespace std;#define _for(i,lo,hi) for(int i=(lo);i<(hi);i++)void printvec(vector<i...原创 2018-08-28 17:32:21 · 146 阅读 · 0 评论 -
1140 Look-and-say Sequence(20 分)
思路:这个题目含义写的好不清楚,开头一句“where D is in [0, 9] except 1. ”,我还以为D不能取1呢,然后算例给的D=1,看了好久才明白这个字符串是怎么描述的,明白了题目就不难了。 一般PAT考试20分题也都是送分题#include<iostream>#include<vector>using namespace st...原创 2018-08-28 19:30:06 · 193 阅读 · 0 评论 -
1142 Maximal Clique(25 分)
思路:没想到什么好方法,直接暴力求解,居然过了#include<iostream>#include<vector>using namespace std;#define _for(i,lo,hi) for(int i=(lo);i<(hi);i++)void printvec(vector<int>& vec){ p...原创 2018-08-28 20:14:35 · 153 阅读 · 0 评论 -
1141 PAT Ranking of Institutions(25 分)
本题玄妙之处在于:总加权分数取整数部分是要对最后的总和取整数部分,不能每次都直接用int存储,不然会有一个3分测试点不通过~ 这种地方表示错了三分不给算例或提示的话根本想不到啊!#include<iostream>#include<vector>#include<cstring>#include<string>#incl...原创 2018-08-28 21:12:54 · 322 阅读 · 0 评论 -
1143 Lowest Common Ancestor(30 分)
思路:因为是BST,所以排序后的节点序就是中序遍历,然后就可以根据中序遍历和先序遍历构造BST 然后就是找公共祖先了,首先排序节点不存在的情况 然后从根节点开始找,因为是BST,所以当两个节点分别属于左右两个分支时,即找到了最低公共祖先#include<iostream>#include<vector>#include<cstring>#inc...原创 2018-08-28 22:14:43 · 399 阅读 · 0 评论 -
1088 Rational Arithmetic(20 分)
思路:分数计算 注意:输出初始的分数的时候也要化成最简形式。#include<iostream>#include<vector>#include<cstring>#include<string>#include<map>#include<algorithm>#include<ctime>us原创 2018-08-29 08:52:18 · 719 阅读 · 0 评论 -
1033 To Fill or Not to Fill(25 分)
思路:关键在于贪心策略的选取 如果把终点也当做一个加油站处理,则代码可以简化很多贪心策略详细描述,遍历在当前站点所能达到的所有站点,分两种情况讨论: 0.寻找比自己距离远的,到能够到达的最大距离之间的加油站,看他们的油价。如果找到了更低价格的油价,就加油到刚好能到达那个加油站的距离的油,然后去那个更低价格的加油站(有更低的我一分都不想多花在别的距离上,只加到刚好满足更低价格的加油站的距离就...原创 2018-08-29 12:31:24 · 913 阅读 · 0 评论 -
1067 Sort with Swap(0,*) (25)
思路:两种方法: 1.模拟交换,注意元素的存储是记录各个元素位置的方式 2.并查集:计算并查集的数目,注意分初试时0是否在原位置两个情况//方法一:模拟交换#include <iostream>#include<algorithm>#include<vector>using namespace std;int main() { //...原创 2018-08-29 15:25:46 · 200 阅读 · 0 评论 -
1038 Recover the Smallest Number (30)
思路: 按照字符串排序,重写cmp函数:str1+str2#include<iostream>#include<string>#include<algorithm>#include<vector>using namespace std;bool cmp(string& str1,string& str2){ ...原创 2018-08-29 15:37:59 · 83 阅读 · 0 评论 -
B1048 数字加密(20 分)
题意写的根本就不清楚啊,要把AB短的地方都当做0处理才对#include<iostream>#include<algorithm>#include<string>#include<cstring>#include<vector>#include<map>using namespace std;#d...原创 2018-09-02 15:35:02 · 401 阅读 · 1 评论 -
1146 Topological Order(25 分)
思路:对于每一个需要判断是不是拓扑排序的数组而言,直接模拟拓扑排序判断即可。但是如果查询的次数非常多的话,单次查询的时间复杂度是O(E),E是图中边的数目。如果采取标记节点层次的方法,单次查询的时间复杂度可以降到O(V),V是图中节点的数目。但是,第二种方法暂时没有想到如何处理两个及以上非连通域的情况。//方法一:模拟拓扑排序#include<iostream>#i...原创 2018-08-28 17:00:34 · 284 阅读 · 0 评论 -
1145 Hashing - Average Search Time(25 分)
题目不难,模拟hash表平方试探法即可。但是坑的地方在于,怎么都看不出来2.8是怎么算出来的,后来还是看了其他人的答案,才发现,原来没有找到的话,试探的次数并不是记MSize,而是记为MSize+1#include<iostream>#include<vector>using namespace std;#define _for(i,lo,hi) fo...原创 2018-08-28 15:53:54 · 336 阅读 · 0 评论 -
A1016 Phone Bills (25)
思路: 第一点是确定排序规则,先根据字符串,这里需注意A65 < a97,即大写字母均在小写字母之前 然后是双指针遍历同一个人的记录并根据要求输出,这里需要注意如何判断该条记录有效,即两条相邻记录分别是online和offline 本程序采用了记录有效数据的下标,读取的时候记录,然后统一输出,其实采用边读边输出的方式更好一些。struct node{ ...原创 2018-08-27 16:18:25 · 127 阅读 · 0 评论 -
A1025 PAT Ranking (25)
思路: 两次排序,一次本地名次,一次总名次,但是没有必要存储两个序列,sort函数可以对特定区间排序,再对整体排序sort(it_lo,it_hi) 笔者第一次做的时候直接将数据存储了多个数组分别排序,每个数据存储了两边,浪费了空间,但是写法上较简单,不用考虑分段排序的下标#include<iostream>#include<string>#...原创 2018-08-27 16:26:50 · 84 阅读 · 0 评论 -
A1028 List Sorting (25)
思路: 三个数据都用string存储会超时,改用不同的类型存储 特别注意,name.c_str(),这样就可以用%s输出了 改为并不都是string后还是超时,感觉是cin太慢,string如何用scanf读取:要预先分配空间string a;a.resize(100); //需要预先分配空间scanf(“%s”, &amp;a[0]); 感觉这个预先分配空间太麻烦了...原创 2018-08-27 16:37:01 · 149 阅读 · 0 评论 -
A1055 The World's Richest (25)
思路: 每次按照不同年龄段分别排序,全部算例超时,时间复杂度太高。 正确的做法是只排序一次,然后从头到尾遍历,如果在题目要求的年龄段则输出。 但是这样也会有一个算例超时,注意到输出的总人数最多100人,所以,在排序后可以先进行预处理,每个年龄最多有100个人,将这些人加入到新的向量当中,然后每次查询在新的向量中遍历,把符合条件的人输出即可。#include<...原创 2018-08-27 20:42:39 · 141 阅读 · 0 评论 -
A1075 PAT Judge (25)
思路:本题依然是排序,条件众多,应该考虑到: 1 只要有一个编译成功的就可以输出,注意编译错误的输出和编译正确0分的输出不同,只要有编译通过的该同学的成就就可以被输出 2 完美数量不能重复加 3 将无效点的总分记为-1,则排序时自动排在后面#include<vector>#include<iostream>#include<alg...原创 2018-08-27 21:16:03 · 130 阅读 · 0 评论 -
A1080 Graduate Admission (30)
思路: 1. 首先按照题目要求给学生排序,这是题目考察的第一点 2. 通过记录各个学校的剩余可录取人数和最后一个录取同学的分数,就可以判断申请的同学可不可以录取 3. 最后将各个学校的录取学生排序输出即可#include<iostream>#include<vector>#include<algorithm>using n...原创 2018-08-27 21:47:46 · 471 阅读 · 0 评论 -
A1095 Cars on Campus (30)
思路: 1. 两次排序,第一次按照车牌号排序,然后标记该项纪录是否有效,并且更新最长停留时间 2. 第二次排序按照时间排序,然后根据查询一次遍历O(n)即可#include<iostream>#include<cstring>#include<string>#include<set>#include<vect...原创 2018-08-27 22:00:59 · 122 阅读 · 0 评论 -
1014 Waiting in Line(30 分)
思路: 观察到每位顾客入队的时刻,就决定了其办理完业务的时间。 考虑到如果队列长度是1的话,入队的人找不到上一个人,所以,用数组表示队列来记录队中各个节点的时间 易错点: Note that since the bank is closed everyday after 17:00, for those customers who cannot be served b...原创 2018-08-27 23:46:30 · 251 阅读 · 0 评论 -
A1017. Queueing at Bank (25)
思路: 由于此题目所有的窗口大小均为1,所以仅需要用一个数组来表示各个窗口的结束服务时间即可,然后遍历合法顾客更新等待时间即可。 初始化使筛选掉来晚了的顾客#include<iostream>#include<vector>#include<string>#include<queue>#include<cst...原创 2018-08-28 01:11:46 · 88 阅读 · 0 评论 -
A1018 Public Bike Management (30)
思路:Dijkstra+DFS.如果只有Dijkstra是不可以的,因为minNeed和minBack在路径上的传递不满足最优子结构,不是简单的相加的过程,只有在所有路径都确定了之后才能区选择最小的need和最小的back 易错点: 返回过程中不调整,一个节点需要带来的数目和返回的数目没有关系,要分别将记录 不能只用Dijkstra 看清楚判...原创 2018-08-28 10:47:51 · 122 阅读 · 0 评论 -
1151 LCA in a Binary Tree(30 分)
此题还是比较简单的,根据中序后续建立二叉树,然后DFS查找节点即可#include&lt;cstdio&gt;#include&lt;iostream&gt;#include&lt;cstring&gt;#include&lt;string&gt;#include&lt;vector&gt;#include&lt;m原创 2018-09-08 23:31:03 · 333 阅读 · 0 评论