突击战commando.pas
【问题描述】
你有n个部下,每个部下需要完成一项任务。第i个部下需要你花Bi分钟交代任务,然后他会立刻独立地,无间断的执行Ji分钟后完成任务。你需要交代任务的顺序,使得所有的任务尽早执行完毕。注意,不能同时给2个部下交代任务,但是部下可以同时执行各自的任务。
【输入格式】commando.in
输入数据包括多组数据,每组数据的第一行为部下的个数N(1≤N≤1000);以下N行有2个正整数B和J(1≤B≤1000,1≤J≤1000),即交代任务的时间和执行任务的时间。输入结束标志符为N=0。
【输出格式】commando.out
对于每组数据,输出(以第i组数据为例):
Case i: Time
【样例输入】
3
2 5
3 2
2 1
3
3 3
4 4
5 5
0
【样例输出】
Case 1: 8
Case 2: 15
【问题分析】
假定有2个人,布置任务的时间分别为a1,a2,执行任务的时间分别为b1,b2
(1)先给第1个人布置任务花时间为a1,然后该人开始任务;
(2)再给第2个人布置任务花时间为a2,当然在布置任务时第1个人是在执行任务的,当第2个任务布置完成后,第1个人的任务执行了a2时,还剩下(b1 – a2)的执行时间(当然这里假设b1>=a2的,否则还没等任务2布置完,任务1就执行完了),第2个人开始执行任务需要b2时间才能完成,若此时第1人的个任务还没完成的话,这里第1个人和第2个人可以同时去执行任务,这里需要的时间是多少呢?当然不是第1个人剩下完成的时间+第2个人完成任务的时间啦!因为他们是同时进行的,谁的时间长就是执行完任务所需要的时间。即为max(b1-a2, b2)
所以总共需要的时间为: a1 + a2 + max(b1 – a2, b2)-------à①
以上是第1个人在安排在前面的,现在来看看,若要把第2个人安排在前面会怎么样呢?如上分析可得,所需要时间为:a2 + a1 + max(b2 – a1, b1)-------à②
由① - ②得:max(b1 – a2, b2) - max(b2 – a1, b1)
(1)若b2>b1,则显然有:
max(b1 – a2, b2) = b2 > b2 – a1 è max(b1 – a2, b2) > max(b2 – a1, b1)
(2)若b2<b1,则显然有:
max(b2 – a1, b1) = b1 > b1 – a2 è max(b2 – a1, b1) > max(b1 – a2, b2)
这样我们就得到一个结论,把执行任务时间长的安排在最前面,那总时间会最小。于是,我们只需要按执行任务的时间从大到小排序,总时间为所有的任务布置时间之和+最后一个任务布置完成后所有任务执行最长的那个。
参考代码为:
S := 0; t := 0;
For I := 1 to n do begin
Inc(s, a[i]);
Dec(t, a[i]);
If t < b[i] then t := b[i];
End;
Writeln(s + t);