题目大意:
有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
【分析】
执行时间较长的任务应该先安排交代,所以使用贪心算法,按J从大到小排序安排任务,代码如下
#include <stdio.h>
#include <vector>
#include <algorithm>
using namespace std;
struct job{
int j,b;
bool operator < (const job& x) const{ //运算符重载
return j > x.j;
}
};
int main(){
int n,b,j,kase = 1;
while(scanf("%d",&n) ==1 && n){
vector<job> v;
for(int i=0;i<n;i++){
scanf("%d%d",&b ,&j);v.push_back(job{j,b});
}
sort(v.begin(),v.end());
int s=0;
int ans=0;
for(int i = 0; i < n ;i++){
s += v[i].b;
ans = max(ans, s+v[i].j);
}
printf("Case %d: %d\n",kase++, ans);
}
return 0;
}