题目描述
你有n个部下,每个部下需要完成一项任务。第i个部下需要你花Bi分钟交待任务,然后他会立刻独立地、无间断地执行Ji分钟后完成任务。你需要选择交待任务的顺序,使得所有任务尽早执行完毕(即最后一个执行完的任务应尽早结束)。注意,不能同时给两个部下交待任务,但部下们可以同时执行他们各自的任务。
输入格式
输入包含多组数据,每组数据的第一行为部下的个数N(1<=N<=1000);以下N行每行两个正整数B和J(1<=B<=10000,1<=J<=10000),即交待任务的时间和执行任务的时间。输入结束表示为N=0。
输出格式
对于每组数据,输出所有任务完成的最短时间。
样例输入
3
2 5
3 2
2 1
3
3 3
4 4
5 5
0
样例输出
Case 1: 8
Case 2: 15
分析
1.执行时间较长的任务先交待,这样可以充分利用任务执行时间去交待后面的任务
2.交待时间是一定耗费的;累加所有的交待时间再加上最后完成的任务的剩余的执行时间就是最终答案。
import java.util.*;
public class Main implements Comparable {
int b;
int j;
public Main(int bb, int jj) {
b = bb;
j = jj;
}
public int compareTo(Object m) {
return (j > ((Main) m).j ? -1 : (j == ((Main) m).j) ? 0 : 1);
}
public static void main(String arg[]) {
Scanner cin = new Scanner(System.in);
int casenum=0;
while (cin.hasNext()) {
final int n = cin.nextInt();
Main[] m = new Main[n];
for (int i = 0; i < n; i++) {
m[i]=new Main(cin.nextInt(),cin.nextInt());
}
Arrays.sort(m);
int time=0,temp=0;
for(int i=0;i<n;i++){
time+=m[i].b;
if((temp-=m[i].b)<=0)temp=0;
if(temp<m[i].j)temp=m[i].j;
}
time+=temp;
System.out.println("Case "+(++casenum)+": "+time);
}
}
}