【题述】
Description
你有n个部下,每个部下需要完成一项任务。第i个部下需要你花Bi分钟交待任务,然后他会立刻独立地、无间断地执行Ji分钟后完成任务。你需要选择交代任务的顺序,使得所有任务尽早执行完毕(即最后一个执行完成的任务应尽早结束)。注意,不能同时给两个部下交待任务,但部下们可以同时执行他们各自的任务。
Input
输入包含多组数据,每组数据的第一行为部下的个数N(1<=N<=1000);以下N行每行两个正整数B和J(1<=B<=10 000,1<=J<=10 000),即交待任务的时间和执行任务的时间。输入结束的标志为N=0。
Output
对于每组数据,先输出“Case #: ”(‘#’表示第几组数据),然后是所有任务完成的最短时间。
Sample Input
3 2 5 3 2 2 1 3 3 3 4 4 5 5 0
Sample Output
Case 1: 8 Case 2: 15
HINT
对于Sample里的第一组数据,你给部下交待任务的顺序应该是1,2,3得到最早的完成时间是8;
第二组数据,你给部下交待任务的顺序应该是3,2,1得到最早的完成时间是15。
思路:
1.交代完第一个人,第一个人在执行任务的同时可以交代第二个人的任务
2.因为部下在执行任务的时候,我可以同时交代别人,所以把执行任务的时间从大到小排以优化时间,最理想化状态就是第一个人执行任务时,我给其他人交代任务,并且其他人同时开始执行任务,只要第一个人的执行时间够长,那么最终时间就只算第一个人的交代任务时间和执行任务时间
3.注意交代任务的时间是实打实的,不可以同时进行,所以一定会被算进所需时间里
4.交代第一个人的时间一定会被算进去,接下来每一步我们判断J和下一个人的B+J的大小来选择添加哪一部分的时间
【通过代码】
#include <stdio.h>
#include <algorithm>
#include <math.h>
#include <iostream>
using namespace std;
struct BJ{
int b,j;
};
int cmp(BJ a,BJ b){
return a.j>b.j;
}
int main(){
int n,i,t,sum,ans;
BJ ex[10005];
t=1;
while(scanf("%d",&n)!=EOF){
sum=0;
if(n==0)
break;
for(i=0;i<n;i++){
scanf("%d%d",&ex[i].b,&ex[i].j);
}
sort(ex,ex+n,cmp);
ans=0;
for(i=0;i<n;i++){
ans+=ex[i].b;
if(ans+ex[i].j>sum)
sum=ans+ex[i].j;//核心
}
printf("Case %d: %d\n",t,sum);
t++;
}
return 0;
}