提交0.39K
通过0.18K
时间限制1000MS
内存限制500MB
题目描述
你有n个部下,每个部下需要完成一项任务。第i个部下需要你花Bi分钟交代任务,然后他会立刻独立地、无间断地执行Ji分钟后完成任务。你需要选择交代任务的顺序,使得所有任务尽早执行完毕(即最后一个执行完的任务应尽早结束)。注意,不能同时给两个部下交代任务,但部下们可以同时执行他们各自的任务。
输入格式
输入包含多组数据,每组数据的第一行为部下的个数n(1<=n<=1000);以下n行,每行两个正整数B和J(1<=B<=10000,1<=J<=10000),即交待任务的时间和执行任务的时间。输入结束标志为n=0。
输出格式
对于每组数据,输出所有任务完成的最短时间。具体输出格式见样例,用Case开头,Case以后输出当前数据的序号,然后输出答案。
输入样例#1
3
2 5
3 2
2 1
3
3 3
4 4
5 5
0
2 5
3 2
2 1
3
3 3
4 4
5 5
0
输出样例#1
Case 1: 8
Case 2: 15
Case 2: 15
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e3+7;
int n;
struct N0{
int a,b;
}N[maxn];
bool cmp(N0 a,N0 b){
if(a.b!=b.b) return a.b>b.b;
else return a.a>b.a;
}
int main(){
int cnt=0;
while(~scanf("%d",&n)){
if(n==0) break;
int i,j;
for(i=0;i<n;++i){
scanf("%d%d",&N[i].a,&N[i].b);
}
sort(N,N+n,cmp);
ll previd1=N[0].a;
ll mx=previd1+N[0].b;
for(i=1;i<n;++i){
previd1+=N[i].a;
mx=max(mx,previd1+N[i].b);
}
printf("Case %d: %lld\n",++cnt,mx);
}
return 0;
}