PAT总结

本文详细记录了解决PAT在线评测平台常见问题的方法和小部分题目的解题思路,包括二分搜索进制、模拟排队问题、简单算法与数据结构应用等。文章还特别强调了容易犯错的地方和注意事项,如正确处理重复解、时间复杂度优化、正确理解题意等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

--->PAT

PAT难度不大,30分的题目(最大分值)也只会考察到一些基本的算法和数据结构。

我比较喜欢写Java,但是这个OJ对于Java并没有优待,内存和时间限制与其他语言一样。

有很多题目,我刚刚读完输入数据就超时或者超内存了。所以我只能混着写,小部分题目(分值20、25)用Java写,大部分(分值25、30)用C++。

这里主要记录一下一些比较容易犯错的地方和小部分题目的思路。



PAT 1010

二分搜索正确的进制,下限为1,上限为另一个数的十进制值+1

需要注意的地方:

搜索到正确解时,还需要在左边继续搜索,因为答案中有写“If the solution is not unique, output the smallest possible radix.



PAT 1014

模拟题

人是怎么想的就让机器怎么做。

以排队的人为对象进行模拟,哪个窗口先空出来,我就去那个。



PAT 1015

很简单的题目,可以试试Miller-Rabin测试。



PAT 1017

Customers按照arriving time快排。

用一个数组记录每个窗口最后一个顾客处理好的时间,也就是可以办理新业务的时间。

对每一个顾客:

每次选择值最小的窗口,更新窗口的值。

需要注意的地方:

comes too late (at or after 17:00:01),排队排到了17:00:00之后还是要处理的。



PAT 1018

最短路问题

当两个路径相同时选择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号节点那里去。



PAT 1021

并查集+BFS遍历

并查集用来判断是否存在多个Component。

任取一节点i作为树根进行BFS遍历,得到一个深度最大的节点集合ANS。

然后从ANS中任意挑选一个作为树根进行BFS遍历,看是否存在深度更大的节点集合,如果有则更新ANS。

输出ANS。



PAT 1026

模拟题

对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分,否则舍去。



PAT 1038

快速排序

对于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



PAT 1039

链表

我是用数组模拟的链表,因为我忘记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,...

之所以采用链表的形式是因为输出的时候需要按照课程编号输出,显然链表是最合适插入操作的。



大家对于这些问题或者其他问题有什么疑问,都可以在这里留言问我。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值