您的位置:首页 > 其它

UVa11729 - Commando War (贪心/思维)

2017-09-22 17:18 267 查看
题目链接

你有n个部下,每个部下需要完成一项任务,第i个部下需要你花费Bi分钟交代任务,然后他会立刻,独立,无间断的执行Ji分钟后完成任务。你需要选择交代任务的顺序,使得所有任务尽早执行完毕(即最后一个执行完的任务应尽早结束)。注意,不能同时给两个部下交代任务,但部下们可以同时执行他们各自的任务。

输入:

第一行为一个整数n

接下来n行每行包括两个正整数,第一个整数为Bi,第二个为Ji。

输出:

所有任务最短的完成时间。

分析:

贪心,按执行时间从大到小的顺序给任务排序,然后依次交代。

思考这样为什么正确,因为我们交代任务的时间是固定的(所有任务的交代时间B之和)

但每个任务完成时间却是不固定的,如果我们把执行时间较长的任务放在前面,那么

我们在交代下一个任务时,这个时间长的任务已经开始执行了,这正是我们贪心的目标。

代码:

#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;

struct job
{
int sayTime,doTime; //交代时间,执行时间.

bool operator < (const job& A) const
{
return this->doTime > A.doTime;
}
};
job xl[1000 + 5];
int main()
{
int n ; int cnt = 0;
while(scanf("%d",&n) == 1 && n)
{
for(int i = 0;i<n;i++)
{
scanf("%d %d",&xl[i].sayTime,&xl[i].doTime);
}
sort(xl,xl+n);
int ans = 0;
int s = 0;
for(int i = 0;i<n;i++)
{
s += xl[i].sayTime; //交代任务的时间是固定的
ans = max(ans,s + xl[i].doTime); //按这样去计算,第i个任务完成的时间 = 前面所有任务的交代时间,
//加上第i个任务的执行时间,我们只需要从中选一个最大的,即是所有任务的完成时间。
}
printf("Case %d: %d\n",++cnt,ans);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: