UVa 11729 Commando War

题目大意:

        现准备打一场突击战,你作为一个长官,有N(1 ≤ N ≤ 1,000)名士兵听你调遣,你给每个士兵分派一个不同的任务,每个士兵执行任务的时候不相互干扰(即可以并行执行,不相互依赖),你需要一次给每个士兵分派任务,对于每个士兵,给他讲解任务的时间为B分钟,而他独立执行完任务的时间为J分钟(1 ≤ B, J ≤ 10,000),现需要你相处一个最为合理的分派任务的顺序,使得所有士兵从第一个被分派任务之前开始到最后一名士兵执行完任务的总时间最短。

        现有多个测例,每个测例中给定N(输入以N = 0结束),以及每个士兵的B和N,对于每个测例求出那个最短时间。

题目链接

注释代码:

/*          
 * Problem ID : UVa 11729 Commando War
 * Author     : Lirx.t.Una          
 * Language   : C++ 11      
 * Run Time   : 0.035                
*/

#include <algorithm>
#include <iostream>
#include <cstdio>
#include <vector>

using namespace std;

//报告时间是顺序的而执行时间是并行的
//类似活动安排问题,贪心法可以解决
//先根据执行时间的大小对job从大到小排列
//然后逐个累计、试探得出最短完成时间

struct	Job {

	//b为报告时间,j为执行时间
	int		b, j;

	Job(void) {}

	friend istream &
	operator>>(istream &is, Job &job) {//输入
	
		is >> job.b >> job.j;

		return is;
	}

	bool
	operator<(const Job &job)
	const {//从大到小排序,使用自己的运算符
		//sort排序时迭代器可以利用
	
		return j > job.j;
	}
};

int
main() {

	int		t;//test case,当前测例序号(从1开始计)
	int		n;//部下个数

	Job		job;//用于临时接受一个部下的任务信息

	//current start and finish time,当前
	//当前任务的开始执行时间和当前所有任务执行完的时间
	int		st, fi;
	int		ans;//最终任务执行完的时间,在贪心选择下将是最优解

	int		i;//计数变量

	t = 0;
	while ( scanf("%d", &n), n ) {
	
		vector<Job>		v;

		for ( i = 1; i <= n; i++ ) {

			cin >> job;
			v.push_back(job);
		}
		sort(v.begin(), v.end());//利用迭代器(泛型函数)
		
		ans = 0;
		for ( st = 0, i = 0; i < n; i++ ) {
			
			st  += v[i].b;//更新当前任务的开始执行时间
			ans  = max( ans, st + v[i].j );//<algorithm>
			//有可能上一个任务结束时间比当前任务结束时间还要晚
		}
		
		printf("Case %d: %d\n", ++t, ans);
	}
	
	return 0;
}

无注释代码:

#include <algorithm>
#include <iostream>
#include <cstdio>
#include <vector>

using namespace std;

struct	Job {

	int		b, j;

	Job(void) {}

	friend istream &
	operator>>(istream &is, Job &job) {
	
		is >> job.b >> job.j;

		return is;
	}

	bool
	operator<(const Job &job)
	const {
	
		return j > job.j;
	}
};

int
main() {

	int		t;
	int		n;

	Job		job;

	int		st, fi;
	int		ans;

	int		i;

	t = 0;
	while ( scanf("%d", &n), n ) {
	
		vector<Job>		v;

		for ( i = 1; i <= n; i++ ) {

			cin >> job;
			v.push_back(job);
		}
		sort(v.begin(), v.end());

		ans = 0;
		for ( st = 0, i = 0; i < n; i++ ) {
		
			st  += v[i].b;
			ans  = max( ans, st + v[i].j );
		}

		printf("Case %d: %d\n", ++t, ans);
	}

	return 0;
}

单词解释:

gunfire:n, 炮火,炮火声

commando:n, 突击队,突击队员

mist:n, 雾

glowing:adj, 灼热的,鲜艳的

silhouette:n, 轮廓,剪影; vt, 找出轮廓

breeze:n, 微风

promising:adj, 有希望的,有前途的

squad:n, 班,小队

diposal:n, 处理,支配

sth at one's disposal:....正听从某人支配

ambush:n, 埋伏,伏击

mater-plan:n, 总体规划,蓝图

enforce:vt, 执行,实施,强制

brief:vt, 简要报告; n, 摘要,简报; adj, 简洁的

necessity:n, 必要性

pause in between:在中间停顿

setter:n, 作者,作曲者

completion:n, 完成,实现

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值