PAT难度不大,30分的题目(最大分值)也只会考察到一些基本的算法和数据结构。
我比较喜欢写Java,但是这个OJ对于Java并没有优待,内存和时间限制与其他语言一样。
有很多题目,我刚刚读完输入数据就超时或者超内存了。所以我只能混着写,小部分题目(分值20、25)用Java写,大部分(分值25、30)用C++。
这里主要记录一下一些比较容易犯错的地方和小部分题目的思路。
二分搜索正确的进制,下限为1,上限为另一个数的十进制值+1
需要注意的地方:
搜索到正确解时,还需要在左边继续搜索,因为答案中有写“If the solution is not unique, output the smallest possible radix.”
模拟题
人是怎么想的就让机器怎么做。
以排队的人为对象进行模拟,哪个窗口先空出来,我就去那个。
很简单的题目,可以试试Miller-Rabin测试。
Customers按照arriving time快排。
用一个数组记录每个窗口最后一个顾客处理好的时间,也就是可以办理新业务的时间。
对每一个顾客:
每次选择值最小的窗口,更新窗口的值。
需要注意的地方:
comes too late (at or after 17:00:01),排队排到了17:00:00之后还是要处理的。
最短路问题
当两个路径相同时选择send最少的,send相同时选择take back最少的。
需要注意的地方:
我一开始想成了要不send要不就take back,但是因为路是顺序走下去的,所以存在既要send也要take back的情况。
举例:
Cmax = 10, Sp = 3.
1号节点存有2辆bike,2号节点存有10辆,3号节点存有4辆。
对于路径0->1->2->3,我们需要send给1号节点3辆,然后从2号节点挪1辆给3号节点,然后take back回来4辆。
所欲这条路径的send是3,take back是4.
错误的产生在于2号节点不能把车挪到1号节点那里去。
并查集+BFS遍历
并查集用来判断是否存在多个Component。
任取一节点i作为树根进行BFS遍历,得到一个深度最大的节点集合ANS。
然后从ANS中任意挑选一个作为树根进行BFS遍历,看是否存在深度更大的节点集合,如果有则更新ANS。
输出ANS。
模拟题
对players按照抵达时间进行排序。
然后就像PAT1017那样进行模拟,只是把银行窗口换成了Table。
需要注意的地方:
1.It is assumed that every pair of players can play for at most 2 hours.
每队player的playing time不能超过2 hours,如果超过了就设置其为2 hours。
2.VIP在有普通空桌和VIP空桌是会优先选择VIP空桌。
例如:有空桌1、2、3,其中2是VIP桌。当VIP抵达时,他们会选择2而不是1.
如果VIP在排队中,这时候有多个桌子结束了游戏,VIP同样优先选择VIP桌。
3.输出的时候要按照Serving time排序,而不是Arriving Time。
4.The waiting time mustbe rounded up to an integer minute(s).
输出waiting time(以minute为单位)时,是要四舍五入的,即大于等于30秒加1分,否则舍去。
快速排序
对于Number a和Number b,以ab和ba的大小作为排序基准。
例如:
321和3214
3213214 < 3214321,所以321在前,3214在后。
32和321
32321 > 32132,所以32在后,321在前。
需要注意的地方:
去除首部的0:需要考虑一个Number全是0,以及所有Number都是0。
例如:
输入1:3 0010 000 00000
输出1:10
输入2:3 0000 000 00000
输出2:0
链表
我是用数组模拟的链表,因为我忘记C++下面的指针的一些细节了,所以偷懒用数组模拟的链表。
定义:
struct Node {
int course;
int next;
};
int heads[26 * 26 * 26 * 10];
Node nodes[2500 * 200];
nodes存放的是所有学生上的所有课。
对于每个Student,他们的名字都是由3位大写字母和1位数字组成,所以可以用一个26*26*26*10的数组映射。
举例更好理解:
假设对于学生AAA0,那么他的映射值为0,他所上的课为:
nodes[head[0]].course, nodes[nodes[head[0]].next].course,...
之所以采用链表的形式是因为输出的时候需要按照课程编号输出,显然链表是最合适插入操作的。
大家对于这些问题或者其他问题有什么疑问,都可以在这里留言问我。