#P954. 工件调度

工件调度

【问题描述】

Jam的工厂新进了一批货,需要赶紧加工,工厂有许多加工机器,对于这些货物来说是绰绰有余了,但是他想合理安排加工方式,使每个加工机器都被充分利用。

举个例子

他希望工件在8小时内加工完成,已知这里有5个工件,按顺序,需要消耗的时间依次为:5 2 4 4 3 即5个工件要在8小时内完工,当然,你可以调度它们分别在5台加工机器上完成,但是每台机器就依次有:3 6 4 4 5 小时是空闲的,那么机器的加工利用率就很低了,这里我们用他们剩余时间的平方和代表你调度的加工利用率,即:3^2+6^2+4^2+4^2+5^2=102

当然,Jam希望这个值越小越好,这样才能使机器被充分利用

另外 同一个机器加工完一个工件后需要休息一个小时!工件的加工是按输入所给定的顺序的。那么对于题目来说 最佳的调度方案就是

]

它的效率为:3^2+1^2+0^2=10

请注意:

1.加工的顺序是给定的不能把后面的工件拿到前面去加工,如图中的2和3不能调换位置,只能依次按给定的顺序调度.这一点请引起注意!

2.休息时间为1小时,对于这个例子,如果Jam要求在7个小时内完成,则5号工件就必须在另一个机器上完成了,当然,题目保证Jam要求的时间一定比消耗最长时间的工件要长,否则就无解了.....

3.你可以视机器的数量是无限的,对于一个调度,你想要几个机器加工都可以,只要总效率最高,也就是效率值最小

4.任何工件都应该向前安排,只能在工件完成后才留出空闲时间,这一点,图中也有体现

【输入文件】(work.in)

输入文件的第一行分别是Jam要求完工的时间和工件的数量

第二行分别为一号工件所需时间,二号工件所需时间...输入顺序就是给定顺序

【输出文件】(work.out)

输出文件为两行,第一行为最小的效率值,第二行至以下为调度方案

【输入样例】

8 5
5 2 4 4 3

【输出样例】

10
5
2 4
4 3

【注释】

输出的方案应使工件尽量向前调度,比如 对于输入

8 3
5 2 5

输出应该为

9
5 2
5

而不是

9
5
2 5

便于大家理解,这里在给几个调度方案,但是他们显然不是最优的,只有上面的那种调度方案才是最优的

这种调度的效率为: 0^2+4^2+0^2=16

这种调度的效率为: 0^2+4^2+4^2+5^2=57

【数据规模】

对于40%的数据有:工件数量<10 Jam要求时间<30

对于100%的数据有:工件数量<500 Jam要求时间<30000

数据保证效率值在长整型范围内