字节跳动2018校招算法方向编程题第3题

题目描述

产品经理(PM)有很多好的idea,而这些idea需要程序员实现。现在有$N$个PM,在某个时间会想出一个idea,每个idea有提出时间、所需时间和优先等级。对于一个PM来说,最想实现的idea首先考虑优先等级高的,相同的情况下优先考虑所需时间最小的,还相同的情况下选择最早想出的,没有 PM会在同一时刻提出两个idea。

同时有$M$个程序员,每个程序员空闲的时候就会查看每个PM尚未执行并且最想完成的一个idea,然后从中挑选出所需时间最小的一个idea独立实现,如果所需时间相同则选择PM序号最小的。直到完成了idea才会重复上述操作。如果有多个同时处于空闲状态的程序员,那么他们会依次进行查看idea的操作。

求每个idea实现的时间。

输入第一行三个数$N$、$M$、$P$,分别表示有$N$个PM,$M$个程序员,$P$个idea。随后有$P$行,每行有$4$个数字,分别是PM序号、提出时间、优先等级和所需时间。输出$P$行,分别表示每个idea实现的时间点。

输入描述

输入第一行三个数$N$、$M$、$P$,分别表示有$N$个PM,$M$个程序员,$P$个idea。随后有$P$行,每行有$4$个数字,分别是PM序号、提出时间、优先等级和所需时间。全部数据范围$[1, 3000]$。

输出描述

输出$P$行,分别表示每个idea实现的时间点。

输入示例

2 2 5
1 1 1 2
1 2 1 1
1 3 2 2
2 1 1 2
2 3 5 5

输出示例

3
4
5
3
9

示例解析

这是一个多执行机多任务调度问题。我们记PM序号、提出时间、优先等级和所需时间相对于程序员的优先级分别记为$P_{PMSeqNum}$、$P_{PropTime}$、$P_{Pror}$和$P_{RunTime}$。显然:

$$P_{Prior} > P_{RunTime} > P_{PMSeqNum} > P_{PropTime} $$

注意:这里的优先等级表示数字越小,则优先级越高。
我们以一张表格来表示程序员实现idea的整个过程。

01 2 34 5 67 8 9
1 (1, 1, 2, 1, 1)
2 (1, 1, 1, 1, 2)
3 (2, 2, 2, 1, 2)
4 (2, 1, 2, 2, 1)
5 (1, 5, 5, 2, 3)

说明: 这里的五元组$(ID, Prior, RunTime, PMSeqNum, PropTime)$分别表示程序员的ID,idea优先等级、 运行时间、 PM序号和提出时间。绿色表示idea处于执行态,褐色表示idea处于等待状态。

整体思路

重点代码讲解

完整代码