UVa 11729 Commando War

来源:互联网 发布:软交换网络各节点功能 编辑:程序博客网 时间:2024/05/09 18:50

-

来源:《算法竞赛入门经典训练指南》第1章例题2、UVa 11729


题目描述:

n个任务,每个任务需要Ji分钟执行,Bi分钟交待,任务交待后开始执行.两个任务不能同时交代但能同时进行,求最短完成所有任务的时间.


题目分析:

每个任务的两个属性捆绑为一个pair,按照执行时长从大到小排序,接着一项一项交待并执行,计算出完成任务的时间就是所要求的最短时长.


算法正确性的严格证明与任务调度相似,去证明任何改变上面算法构造出来的任务序列的操作都不会得到更好的结果.


一种简单的理解方式是:交待任务所需的时间是死的,因此从某种意义上说最终结束的时间决定于任务执行的时长,因此执行时间长的任务放在后面肯定是不利的.具体证明就是写出不等式,回到上面提到的与任务调度相似的证法.本题属于贪心算法题,但算作所谓[构造题]也无不可.

//  Created by wander on 16/06/20.//  Copyright © 2016年 W4anD0eR96. All rights reserved.//  From: UVa 11729//  Sort: Greedy#include "bits/stdc++.h"using namespace std;typedef pair< int, int > P;const int MAXN = 1020;int n, kase, s, res;P Jobs[MAXN];           // first表示任务执行所需时间,second表示任务交代所需时间int main() {#ifdef DEBUG  freopen("in", "r", stdin);  freopen("out", "w", stdout);#endif  while (~scanf("%d", &n) && n) {    for (int i = 0; i < n; i += 1) scanf("%d%d", &Jobs[i].second, &Jobs[i].first);    sort(Jobs, Jobs + n, greater<P>());    s = res = 0;    for (int i = 0; i < n; i += 1) {      s += Jobs[i].second;                // 当前任务开始执行的时间      res = max(res, s + Jobs[i].first);  // 更新任务执行完毕时的最晚时间    }    printf("Case %d: %d\n", kase += 1, res);  }  return 0;}
0 0
原创粉丝点击