UVa 11729 Commando War 突击战

来源:互联网 发布:相机软件大全 编辑:程序博客网 时间:2024/05/29 15:04


题意:你要给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;}

0 0
原创粉丝点击