C/C++每日小练(五)——袭击战

袭击战

你有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


解:这是一个简单地贪心算法的应用——运行时间较长的任务先交代(选择两个任务运行时。顺序不同而导致总时间不同,在讨论选择两个任务哪个先运行的问题上,能够看出,因为两个任务交代的时间B是固定的,所以只比較两个任务的运行时间J就可以),所以要依照J从小到大的顺序给各个任务排序,然后依次交代~

Code:

#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;

struct Job {
	int j, b;
	bool operator < (const Job& x) const {		//运算符重载,要加上const~~
		return j > x.j;
	}
};

int main() {
	int n, b, j, count = 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());										//使用Job类自己的<运算符排序
		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", count++, ans);
	}
	return 0;
}

执行结果:


posted @ 2017-04-25 19:51  jzdwajue  阅读(143)  评论(0编辑  收藏  举报