你有n个部下,每个部下需要完成一项任务。第i个部下需要你花Bi分钟交待任务,然后他会立刻独立地、无间断地执行Ji分钟后完成任务。你需要选择交待任务的顺序,使得所有任务尽早执行完毕(即最后一个执行完的任务尽早结束)。注意,不能同时给两部下交待任务,但部下们可以同时执行他们各个的任务。
【输入格式】
输入包含多组数据,每组数据的第一行为部下的个数,N(1<=N<=1000);以下N行每行两个整数B和J(1<= B <= 1000, 1<= J <= 1000),即交待任务的时间。输入结束标志为N=0。
【输出格式】
对于每组数据,输出每组任务完成的最短时间。
【样例输入】
3
2 5
3 2
2 1
3
3 3
4 4
5 5
0
【样例输出】
Case 1: 8
Case 2:15
代码如下
#include <cstdio>#include <vector>
#include <algorithm>
using namespace std;
//定义一个士兵结构体
struct Job{
int j; //完成任务花的时间
int b; //交待任务花的时间
bool operator < (const Job& x) const{ //操作符重载,后面使用sort时使用
return j > x.j;
}
};
int main(){
int n, b, j, kcase = 1;
Job job;
while(scant("%d", &n) == 1 && n){
vector<Job> v;
for(int i=0; i<n; i++){
scanf("%d%d", &j, &b);
job.j = j;
job.b = b;
v.push_back(job);
}
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", kcase, ans);
}
return 0;
}
执行过程
4 7
4 5
6 2
0:s = 4, ans = max(0, 4+7) = 11
1: s = 4 + 4 = 8, ans = max(11, 8+5) = 13
2: s = 8 + 6 = 14, ans = max(13, 14 + 2 = 16) = 16;