题目描述
产品经理(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的整个过程。
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 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处于等待状态。