PAT - 浙江大学计算机程序设计能力测试在线评判系统
浙大PAT (Advanced Level)题目地址:http://pat.zju.edu.cn/contests/pat-a-practise
下面主要是大致的阶解题思路,代码记录在Github上,请戳这里
简单的模拟题,主要是a+b以后对结果的格式化,注意下细节就可以了
简单的模拟题,可以初始化a[0...1000]和b[0...1000]记录并相加,非0项就是答案
1.深搜+回溯,搜索所有可能结果,并保存最好的结果。
2.Dijsktra算法,先找最短路径,最短路径基础上在保证救援队伍数量最多。
根据题目输入构造tree的结构,并用map<string, node*> hash来快速检索输入的节点在树结构中的位置,当所有都建立好了,用队列来进行层次遍历,就可以找到每层的叶子结点数量
模拟题,预处理一个string[]存储'zero'到'nine',根据计算的结果按位输出string[]的内容
时间化成整数,按照HH:MM:SS = HH*60*60+MM*60+SS,偷懒的话直接按照开始时间从小到大排序输出第一个,再按照结束时间从大到小输出第一个。也可以遍历元素列表一遍,维护开始最小时间和结束的最大时间
很常见的最大子段和DP问题,dp[i]表示以第i个数结尾和最大,那么dp[i+1] = max{dp[i]+a[i+1], a[i+1]};可以优化只用一个临时变量tmp就可以完成。最后注意保存最大子段和出现的位置。
模拟题,每次比较下上一次和当前楼层高度,最后加上总的停留时间
这题和1002解题思路相同
1.只考虑tag为1,如果tag为2,那么我们把N1和N2调换一下顺序
2.对于N2来说,我们可以根据他出现的数值判断出它至少是多少进制的数
3.对于一个数,如果它的进制越大,那么它表示的数越大,反之越小,那么进制的大小和他所表示的数是单调递增函数
4.那么就可以使用二分N2的进制的方法来找答案
5.中间结果可能很大,用long long来表示
简单模拟题,看懂题意即可。
模拟题,我用了4个vector<>来记录A、C、M、E,有点冗余,四个记录的东西是一样的,当读入数据完成后,对他们分别按照A、C、M、E的要求排序.查询时候,遍历4个vector<>,就可以找到答案了。
题意是删去一个点,剩下的城市需要多少条边能把他们连起来。
我们只需要删去这个点相关的所有路径,然后DFS一下,FloodFill,看现在的图有多少块组成,就可以知道需要多少条边连接他们了。
稍微麻烦一点的模拟题,模拟银行排队,先初始化各个窗口前排队队列,然后模拟工作开始,
从开始时间到终止时间:
-
当前time,遍历所有窗口进行一次工作,窗口工作完的人,踢出去。
-
如果窗口空闲,调入下一个排队的,直到没窗口
-
补充所有窗口的排队人数,直到队列不足
-
time++
模拟题,判断一个数N在D进制下是质数并且它的reverse数也是质数。需要prime()判断质数和reverse()翻转函数即可。
稍微复杂的模拟题。先存储所有的通话记录,然后按记录的时间排序,遍历记录列表,按照名字去统计每个人的有效通话时间和价格记录。
模拟题。给定银行工作的顾客数量和窗口数量,给定每个顾客的到达时间和处理业务所需时间,计算顾客的平均等待时间。
对所有顾客按照到来时间进行排序,然后用队列模拟银行处理业务的过程,最后的结果是总等待时间除以合法的受理的顾客,而不是所有的人数。
这题和1014做法类似。
深搜+回溯。
参考例子:http://linest.iteye.com/blog/1423959
1019.General Palindromin Number
模拟题,判断一个数N在b进制下是否是回文数。
给定一棵树的PostOrder和InOrder遍历结果,用它构造树,然后输出树的层次遍历结果。
1 struct node 2 { 3 int val; 4 node *left; 5 node *right; 6 node(const int &v); 7 }; 8 9 void build(node * &r, int post[],int in[],int postLeft,int postRight, int inLeft, int inRight) 10 {//构造以r为根的二叉树 11 if(inLeft > inRight) 12 {//二叉树无结点,空二叉树 13 r = NULL; 14 } 15 else 16 { 17 r = new node(post[postRight]); 18 int mid = inLeft; 19 while(in[mid] != post[postRight]) 20 {//找出中序遍历中根的位置 21 mid++; 22 } 23 24 build(r->left, post, in, postLeft, postLeft+(mid-1-inLeft), inLeft, mid-1); 25 build(r->right, post, in, postLeft+mid-inLeft, postRight-1, mid+1, inRight); 26 } 27 } 28 29 node *root; 30 build(root, postOrder, inOrder, 0, n-1, 0, n-1);
1021.Deepest Root
用并查集判断树的个数判断是否是一棵树,如果是,BFS遍历树,记录距离,第一次BFS找到距离根最远的叶子节点,第2遍BFS找到距离最远的所有结点的集合。
1022.Digital Library
模拟题,字符串分割处理。
1023.Have Fun with Numbers
模拟,将给定的数乘以2,如果运算前和运算后得到的数字不计顺序是一样的,就输出yes否则no。
1024.Palindromic Number
模拟题,主要就是判断是否是回文和Reverse数字,我用的Java的BigInteger。与1015有点类似。
1025.PAT Ranking
模拟题,用algorithm的sort来做。
1026.Table Tennis
复杂一点的模拟题,思路同银行排队那两道题,理清关系就可以搞定了。
1027.Color in Mars
模拟题,进制转换。
1028.List Sorting
模拟题,与1025类似。
1029.Median
求两个数组的中位数是多少。中位数:一组数据中间位置的数,如果是偶数,取中间两个位置数的平均数。《算法导论》上记得好像也有讲的。
http://blog.csdn.net/alexingcool/article/details/7932441
1030.Travel Plan
图论,用BFS+Priority_Queue.
1031.Hello World for U
模拟题。
1032.Sharing
找到一个链表公共结点的位置。1.每访问一个结点就对该节点做标记,然后访问第二个,如果元素访问过,就找到公共结点。2.考虑当前结点到初始结点的距离,两个链表用距离度量,如果两个链表长度相同的话,那么相交结点在两个链表上距离相同。
1033.To Fill or Not to Fill
思路是贪心。代码参考:http://blog.csdn.net/Hackbuteer1/article/details/7402127
1034.Head of a Gang
用DFS遍历。
1035.Password
简答模拟题。
1036.Boys vs Girls
简单模拟题
1037.Magic Coupon
读入Coupon和Product后,排序。然后分别按照从首尾两个方向遍历相加。
1038.Recover the Smallest Number
把一堆数组合在一起为最小。直接比较字符串就可以了,用cmp函数,注意一下0.
1039.