UVa 11729 Commando War 突击战

本文介绍了一种关于任务分配的贪心算法问题,通过对比不同部下的任务完成时间来确定最优的任务分配顺序,以实现整体任务最快完成的目标。

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



题意:你要给n个部下分派任务。对于第i个部下,你需要花费Bi的时间去交待任务,他需要花费Ji的时间去完成任务。每个部下一旦接到任务就会立刻无间断地执行直到完成任务。交待任务时不能同时对两个部下交待任务。你需要选择交待任务的顺序,使得所有任务尽快完成。



贪心题。既然是交待任务的顺序,那么只需要对这些任务有个比较关系就可以了,可以这样比较:对于两个连续的部下x和y,考虑这两个部下的任务都完成所需要的时间T。我们假设先给部下x交待任务,则时间是Tx = Bx + max(Jx, By + Jy),假设先给部下y交待任务,则时间是Ty = By + max(Jy, Bx + Jx)。若Jx > Jy,则Ty = By + Bx + Jx,此时Ty > Bx + Jx,且Ty > By + Bx + Jy,也就是Ty > Bx +max(Jx, By + Jy) = Tx。因此应该先交待x任务。反之亦然。因此,贪心准则只需比较每个部下完成任务的时间J,根据J从大到小排序依次交待任务并完成即可。




#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <vector>
#include <map>
using namespace std;

const int MAX = 1005;

struct Job
{
    int b;
    int j;
};

int Case = 0;
int n;
Job job[MAX];

bool cmp(Job j1, Job j2)
{
    return j1.j > j2.j;
}

void input()
{
    for(int i = 0; i < n; i++)
        scanf("%d%d", &job[i].b, &job[i].j);
}

void solve()
{
    sort(job, job + n, cmp);
    int ans = 0, temp = 0;
    for(int i = 0; i < n; i++)
    {
        temp += job[i].b;
        ans = max(ans, temp + job[i].j);
    }
    printf("Case %d: %d\n", ++Case, ans);
}

int main()
{
    while(scanf("%d", &n) && n != 0)
    {
        input();
        solve();
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值