ZJU PAT (Advanced Level) Practise 解析

PAT - 浙江大学计算机程序设计能力测试在线评判系统 

浙大PAT (Advanced Level)题目地址:http://pat.zju.edu.cn/contests/pat-a-practise

下面主要是大致的阶解题思路,代码记录在Github上,请戳这里

1001.A+B Format

简单的模拟题,主要是a+b以后对结果的格式化,注意下细节就可以了

1002.A+B for Polynomials

简单的模拟题,可以初始化a[0...1000]和b[0...1000]记录并相加,非0项就是答案

1003.Emergency

1.深搜+回溯,搜索所有可能结果,并保存最好的结果。

2.Dijsktra算法,先找最短路径,最短路径基础上在保证救援队伍数量最多。

1004.Counting Leaves

根据题目输入构造tree的结构,并用map<string, node*> hash来快速检索输入的节点在树结构中的位置,当所有都建立好了,用队列来进行层次遍历,就可以找到每层的叶子结点数量

1005.Spell It Right

模拟题,预处理一个string[]存储'zero'到'nine',根据计算的结果按位输出string[]的内容

1006.Sign In and Sign Out

时间化成整数,按照HH:MM:SS = HH*60*60+MM*60+SS,偷懒的话直接按照开始时间从小到大排序输出第一个,再按照结束时间从大到小输出第一个。也可以遍历元素列表一遍,维护开始最小时间和结束的最大时间

1007.Maximum Subsequence Sum

很常见的最大子段和DP问题,dp[i]表示以第i个数结尾和最大,那么dp[i+1] = max{dp[i]+a[i+1], a[i+1]};可以优化只用一个临时变量tmp就可以完成。最后注意保存最大子段和出现的位置。

1008.Elevator

模拟题,每次比较下上一次和当前楼层高度,最后加上总的停留时间

1009.Product of Polynomials

这题和1002解题思路相同

1010.Radix

1.只考虑tag为1,如果tag为2,那么我们把N1和N2调换一下顺序

2.对于N2来说,我们可以根据他出现的数值判断出它至少是多少进制的数

3.对于一个数,如果它的进制越大,那么它表示的数越大,反之越小,那么进制的大小和他所表示的数是单调递增函数

4.那么就可以使用二分N2的进制的方法来找答案

5.中间结果可能很大,用long long来表示

1011.World Cup Betting

简单模拟题,看懂题意即可。

1012.The Best Rank

模拟题,我用了4个vector<>来记录A、C、M、E,有点冗余,四个记录的东西是一样的,当读入数据完成后,对他们分别按照A、C、M、E的要求排序.查询时候,遍历4个vector<>,就可以找到答案了。

1013.Battle Over Cities

题意是删去一个点,剩下的城市需要多少条边能把他们连起来。

我们只需要删去这个点相关的所有路径,然后DFS一下,FloodFill,看现在的图有多少块组成,就可以知道需要多少条边连接他们了。

1014. Waiting in Line (30)

稍微麻烦一点的模拟题,模拟银行排队,先初始化各个窗口前排队队列,然后模拟工作开始,

从开始时间到终止时间:

  1. 当前time,遍历所有窗口进行一次工作,窗口工作完的人,踢出去。

  2. 如果窗口空闲,调入下一个排队的,直到没窗口

  3. 补充所有窗口的排队人数,直到队列不足

  4. time++

1015.Reversible Primes

模拟题,判断一个数N在D进制下是质数并且它的reverse数也是质数。需要prime()判断质数和reverse()翻转函数即可。

1016.Phone Bills

稍微复杂的模拟题。先存储所有的通话记录,然后按记录的时间排序,遍历记录列表,按照名字去统计每个人的有效通话时间和价格记录。

1017.Queueing at Bank

模拟题。给定银行工作的顾客数量和窗口数量,给定每个顾客的到达时间和处理业务所需时间,计算顾客的平均等待时间。

对所有顾客按照到来时间进行排序,然后用队列模拟银行处理业务的过程,最后的结果是总等待时间除以合法的受理的顾客,而不是所有的人数。

这题和1014做法类似。

1018.Public Bike Management

深搜+回溯。

参考例子:http://linest.iteye.com/blog/1423959

1019.General Palindromin Number

模拟题,判断一个数N在b进制下是否是回文数。

1020.Tree Traversals

给定一棵树的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.

原文地址:https://www.cnblogs.com/tiny656/p/2856191.html