UVa11729 - Commando War (贪心/思维)

该博客介绍了一个利用贪心算法解决的指挥官任务分配问题。每个部下有不同的交代时间和执行时间,目标是最小化所有任务的完成时间。通过将部下按执行时间从大到小排序并依次交代任务,可以实现这一目标。博客内容包括问题分析和解决方案代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接


你有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);
	}	
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值