突击战

突击战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);

原文地址:https://www.cnblogs.com/ahmasoi/p/3472074.html