Input
There will be multiple test cases in the input file. Every test case starts with an integer N (1<=N<=1000), denoting the number of soldiers. Each of the following N lines describe a soldier with two integers B (1<=B<=10000) & J (1<=J<=10000). B seconds are needed to brief the soldier while completing his job needs J seconds. The end of input will be denoted by a case with N =0 . This case should not be processed.
Output
For each test case, print a line in the format, “Case X: Y”, where X is the case number & Y is the total number of seconds counted from the start of your first briefing till the completion of all jobs.
Sample Input Output for Sample Input
3
2 5
3 2
2 1
3
3 3
4 4
5 5
0
Case 1: 8
Case 2: 15
【题目翻译】:
【思路】:
贪心算法:处理时间长的先交代。按照J从大到小的顺序给任务排序,依次交代。
【代码】:
[cpp] view plaincopy
/*********************************
* 日期:2013-4-20
* 作者:SJF0115
* 题号: 题目11729 - Commando War
* 来源:http://uva.onlinejudge.org/index.php option=com_onlinejudge&Itemid=8&category=117&page=show_problem&problem=2829
* 结果:AC
* 来源:UVA
* 总结:
**********************************/
#include
#include
typedef struct Time{
//交代时间
int B;
//处理时间
int J;
}Time;
//排序函数
int cmp(const void *a,const void *b){
struct Time * c = (Time *)a;
struct Time * d = (Time *)b;
return d->J - c->J;
}
Time T[1001];
int main ()
{
int i,N,Case = 1;
//freopen("C:\\Users\\XIAOSI\\Desktop\\acm.txt","r",stdin);
while(scanf("%d",&N) != EOF && N != 0){
//N个士兵
for(i = 0;i < N;i++){
scanf("%d %d",&T[i].B,&T[i].J);
}
//按处理时间排序
qsort(T,N,sizeof(T[0]),cmp);
int startTime = 0;
int endTime = 0;
for(i = 0;i < N;i++){
//开始执行时间
startTime += T[i].B;
//最晚结束时间
if(endTime < T[i].J + startTime){
endTime = T[i].J + startTime;
}
}
printf("Case %d: %d\n",Case,endTime);
Case++;
}
return 0;
}