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