突击战(Commando War,UVa 11729)
你有n个部下,每个部下需要完成一项任务。第i个部下需要你花Bi分钟交待任务,然后他会立刻独立地、无间断地执行Ji分钟后完成任务。你需要选择交待任务的顺序,使得所有任务尽早执行完毕(即最后一个执行完的任务尽早结束)。注意,不能同时给两部下交待任务,但部下们可以同时执行他们各个的任务。
【输入格式】
输入包含多组数据,每组数据的第一行为部下的个数,N(1<=N<=1000);以下N行每行两个整数B和J(1<= B <= 1000, 1<= J <= 1000),即交待任务的时间。输入结束标志为N=0。
【输出格式】
对于每组数据,输出每组任务完成的最短时间。
【样例输入】 3 2 5 3 2 2 1 3 3 3 4 4 5 5 0 【样例输出】 Case 1: 8 Case 2:15
代码如下
#include <cstdio>#include <vector>
#include <algorithm> using namespace std;
//定义一个士兵结构体 struct Job{ int j; //完成任务花的时间 int b; //交待任务花的时间
bool operator < (const Job& x) const{ //操作符重载,后面使用sort时使用 return j > x.j; } }; int main(){ int n, b, j, kcase = 1; Job job; while(scant("%d", &n) == 1 && n){ vector<Job> v; for(int i=0; i<n; i++){ scanf("%d%d", &j, &b); job.j = j; job.b = b; v.push_back(job); } 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", kcase, ans); } return 0; }
执行过程
4 7 4 5 6 2 0:s = 4, ans = max(0, 4+7) = 11 1: s = 4 + 4 = 8, ans = max(11, 8+5) = 13 2: s = 8 + 6 = 14, ans = max(13, 14 + 2 = 16) = 16;