您的位置:首页 > 其它

uva11729 - Commando War

2013-07-08 18:57 211 查看
题目大意:

你有n个部下,每个部下要完成一个任务,你需要花费bi去交代任务给第i个部下,随后他需要ji分钟去完成,现在你需要安排这些任务分配顺序,使得最终的完成任务时间(所有任务都完成)最小。

输入:

第一行一个整数n表示任务数。

接下来n行为bi,ji代表交代任务的时间以及执行任务的时间。

输出:

每组数据输出最早完成所有任务的时间。

分析:

这道题目属于贪心,我们来考虑这样的情况。交换任务x、y(将y提到x前)分为以下两种情况:

1、y比x早结束

那么将任务y提到x前,完成这两个任务需要的时间比交换前的要晚。

2、y比x晚结束

若要求最后完成的时间比交换前则急需要B[x]+J[x]+B[y]>=B[y]+J[y]+B[x],化简后就是J[x]>=J[y]

所以我们可以按照执行所需时间排序(大到小),优先安排执行时间长的任务,可以得到最优的解。

分类:简单贪心

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define maxlen 1010
using namespace std;
struct node
{
int a,b;
}massion[maxlen];
bool cmp(node p,node q)
{
return p.b>q.b;
}
int main ()
{
int n,l=1;
while(scanf("%d",&n),n)
{
for(int i=0;i<n;++i)
scanf("%d%d",&massion[i].a,&massion[i].b);
sort(massion,massion+n,cmp);
int ans=0,s=0;
for(int i=0;i<n;++i)
{
s+=massion[i].a;
ans=max(ans,s+massion[i].b);
}
printf("Case %d: %d\n",l++,ans);
}
}


  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: