题目大意:
现准备打一场突击战,你作为一个长官,有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, 完成,实现