题意简述
你有一个CPU和若干(<=15000)个进程。每个进程有四个参数:代号,到达时间,运行时间,优先级。输入顺序保证按照到达时间排序。你会先处理先到达的任务。但是当你处理一个任务到一半的时候,来了一个优先级更高的任务,那么你会把刚刚那个任务放一半,处理优先级高的任务,再回来继续处理刚刚那个任务。这时候如果再被打断,那就要在搁置一会。
就这样操作下去。按照结束时间的顺序,输出每个任务的代号,以及它结束的时间。
思路框架
开优先队列维护。先处理掉时间不冲突的任务,然后把时间冲突的任务分成两半,把后面一半再放会优先队列里面。由于时间自然有序,优先队列要先比较优先级,再比较开始时间。
具体思路
我们记录一个时间戳T,表示当前考虑到的时间。那么如果我们发现某个任务完成了,那么它的结束时间就是T了。输出即珂。
我们在线做,也就是说,我们不断输入进程,不断做。不实际保存。
对于新输入的进程a,我们不断找优先级最大并且在a之前就结束掉的任务。我们把它完成,并计算出它的结束时间。输出即珂(没错,边输入边输出)。
如果这个时候还有任务在队列中留着,那么我们把它和a重叠的部分单独切出来,然后重新入一次队列。删除原来那个任务。
关于如何切出来这个任务:
设这个任务是t。
一张丑图:
其中黄色的部分就是我们t被a占用的,切出来留着后面处理的部分。它的长度是T+t.len-a.st。其它的保持不变就好了。
输入完之后,肯定还有被我们切出来的任务还没有处理。我们按优先级处理它们就好了。
代码
1 |
|