uva 11729-Commando War

题目大意:

        有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;
}


猜你喜欢

转载自blog.csdn.net/haoge9551/article/details/47338475
war