这题怎么做,求PAT甲级题考点(转载各个大佬)解答

PAT甲级1009测试案例有一个通不过麻煩各位PAT甲级题考点(转载各个大佬)给看看啦

0


    

 
题目大意:给出K个树判断是否為红黑树;
红黑树是每个节点都带有颜色属性的二叉查找树,颜色为红色黑色在二叉查找树强制一般要求以外,对于任何有效的红黑樹又有如下的额外要求:(定义来源:)
  1. 所有叶子都是黑色(叶子是NIL节点)
  2. 每个红色节点必须有两个黑色的子节点。(从每个叶子到根嘚所有路径上不能有两个连续的红色节点)
  3. 从任一节点到其每个叶子的所有简单路径都包含相同数目的黑色节点
 
思路:第4点只需要一次DFS判断就可以解决。第5点的要求对于每个节点,先获取它的左右子树黑色节点的高度再进行判断;这里全是递归,真的很绕脑~~
int getNum(BT t);//获取当前節点的左右子树的高度(仅为黑色节点的高度)
 
 
 
这题就相当于模拟银行在运行时候的样子有N个窗口,设有黄色警戒线每个窗口黄色警戒线里最多能有M个人,一共有K个客户银行从上午8:00开始营业,一共有K个客户(id从1~N)每个客户在选择黄线时会选择最短的线路等待如果有两条或更多条具有相同长度的线,客户将总是选择最小的窗口依次对队伍中每個人进行服务,服务完的客户离开下一人继续服务如果客户在下午17:00之前(不包括17:00)还没有开始服务,则不能进行服务输出Q个客户查询箌自己的结束时间,若能服务则按格式输出时间,若不能服务则输出sorry
模拟银行的排队情况可以用队列,因为队列具有先来先服务的性質和银行排队的要求相同。每一个窗口对应一个队列记录队列的进出情况。题目要求中的每个客户在选择黄线时会选择最短的线路等待如果有两条或更多条具有相同长度的线,客户将总是选择最小的窗口等同于在警戒线外的人需要等待哪个窗口在服务的人最先离开,就去哪个窗口对于同时有多个窗口有人离开,则选择最小的窗口所以离开和进入是同时发生的。
我这里选用的思路是若有人进入队列则就知道他结束的时间所以需要用last[i]保留第i号窗口中队列中最后一个人的id。结束时间是先用分钟计时从0开始,每个窗口初始第一个被垺务的人结束时间直接为他所需服务时间其他后进入的人的结束时间为队列中最后一个人的结束时间和他本身所需时间之和。而且判断該客户能否服务并不是看他的结束时间是否>540而是看未进入队列时最后一个人的结束时间当队列中最后一个人的服务时间如果>=540,说明将要进叺队列的这个人一定不能服务,用数组exceed[i]为1记录第i个客户不能进行服务,而且同时要更新last数组的值
首先需要初始化所有队列的情况,因为黄線内在开始服务时就已经站满进行M次循环,从0号窗口开始到N号窗口依次按id号增大的顺序。然后如果有客户在黄线外则需要模拟进队出隊的操作如何让等待的用户选择最短的线路等待,这个就要模拟时间的进行从第0分钟到第540分钟,如果窗口队列中正在服务的第一个到叻他的结束时间就离开队伍,这时下一个id的人就会进入到当前窗口的队伍同初始化进入队列一样。
1.对于队列数组不能直接写成queue<int> q[5]会报错而是要用结构体,将队列放入结构体中
2.这里是17:00之前开始服务对于之前开始服务但是服务结束时间超过17:00的,不是输出Sorry而是对应结束时间当然由于这题小时的范围限制8-17,分钟的范围限制在0-59,因此哪怕超时也不会超过18:00的。
3.当客户进入一个窗口的队伍中哪怕其他窗口都没有人了,他也不会换队

5.若540分钟模拟结束还有客户没有进入队伍,则剩下的客户全部都不能进行服务更新exceed数组的状态,如果少了这一步第四個测试样例会报错。
6.不能理解的坑)按照我这种思路在对模拟进出队列时的过程中若此时客户的id已经超过了客户最大的id值N,则需要break否则最后一个样例怎么也通不过。按我的想法来说break是否有应该不影响才对不break只是会对之后的id进行计算,虽然好像会产生数组越界的情况c++是允许越界的,但是查询的时候id还是在范围内,范围内的数据肯定会对的所以没想明白。
int exceed[maxk]; //每个客户是否超过服务时间为0表示能服務,为1表示不能服务 
int N,M,K,Q; //窗口数黄线以内最大人数,客户数需查询客户数 
 
 
 
忍不住想吐槽一下,这题的最后一个坑找了我好几个小时测试點怎么都没问题,能想关于测试点的坑都想遍了还是最后试出来的这个坑。如果以后我弄明白了再来填坑

我要回帖

更多关于 PAT甲级题考点(转载各个大佬) 的文章

 

随机推荐