题意:首长给士兵交代任务,交代任务需要时间b,士兵执行任务需要时间j,首长必须一个个交代任务,不能同时给两个人交代,交代任务的同时士兵可以执行任务。问花费的最少时间。
思路:
根据题意,很容易想到通过调整给士兵交代任务顺序来调整所用时间 ,那么在调整顺序的时候,如图,X和Y交换位置,要想交换后(Y在前X在后)的用时没有交换前(X在前Y在后)的优,满足B[X]+B[Y]+J[Y]<B[Y]+B[X]+J[X]即可,化简得J[Y]<J[X](即X执行用时一定要比Y执行用时大)。至此,大体思路为:将所有的J排序,从大到小(因为交换后肯定没有现在的时间更优),再计算执行完所有任务所用的最少时间。
Hint:
s+=dr[i].b;//当前任务的开始执行时间 ans=max(ans,s+dr[i].j)//更新任务执行完毕时的最晚时间
完整代码:
#include <iostream> #include <algorithm> #include <cstdio> using namespace std; #define N 10005 struct node{ int b,j; }dr[N]; bool cmp(node a,node b){ return a.j>b.j; } int main(){ int n,p=1; while(scanf("%d",&n)!=EOF&&n){ for(int i=0;i<n;i++){ scanf("%d%d",&dr[i].b,&dr[i].j); } sort(dr,dr+n,cmp); int s=0,ans=0; for(int i=0;i<n;i++){ s+=dr[i].b; ans=max(ans,s+dr[i].j); } printf("Case %d: %d\n",p++,ans); } return 0; }