若采用部署时间从长到短的顺序排序的话,由于完成任务的时间不确定,不能保证前一完成/部署的时间与下一部署时间重叠时间最大。因此采用完成时间从长到短的顺序排序。
输入包含多组数据,每组数据的第一行为部下的个数n(1<=n<=1000);以下n行,每行两个正整数B和J(1<=B<=10000,1<=J<=10000),即交待任务的时间和执行任务的时间。输入结束标志为n=0。
Output
对组每组数据,输出所有任务完成的最短时间。具体输出格式见样例,用Case开头,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
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <vector>
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;//n个人,b的时间交代任务,j的时间完成任务
while(scanf("%d",&n) && n != 0){
vector<job> v;//一个个体有多个变量并需要以某一变量进行分析,排序时可创造一结构体,配合vector进行排序
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);
}
}
/*一开始错误的想法
{
int N;
int TELL[maxn],DO[maxn];
while(cin >> N &&N != 0)
{
for(int i = 0;i < N;i++){{scanf("%d%d,&Tell[i],&DO[i]);}
}
}*/