题目大意:
一个将军要布置给N个手下以任务。对士兵I而言,将军布置任务需要时间Xi,士兵执行任务需要时间Yi,求所有任务完成的最短时间。
题目链接:https://vjudge.net/problem/UVA-11729
题目分析:
对于两个士兵J,K而言,分别有Xj,Yj,Xk,Yk。如果Yj>Yk。那么无论这两个任务怎么安排任务,第二个任务开始执行的时间始终是Xj+Xk。那么问题来了J,K谁被安排在第二个执行呢?如果安排J的话,那么最长长度为XJ+XK+YJ。如果安排K的话,那么最长长度为max(XJ+XK+YK , XJ+YJ).可以见到,后者无论哪个都是明显小于前者的。所以如果把Yi长的士兵放到后面安排。那么最长时间长度会变长。所以Y长的要放到最前面安排。所以对Y排个序就好了。
代码如下:
/*by kzl*/
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<queue>
#include<stack>
#include<vector>
using namespace std;
const int maxx = 1000+50;
const int INF = 0x3f3f3f3f;
typedef long long LL;
int n;
struct My{
int x,y;
}re[maxx];
bool cmp(My a,My b)
{
return a.y>b.y;
}
int main(){
int icase = 1;
while(scanf("%d",&n)!=EOF)
{
if(n==0)break;
for(int i=0;i<n;i++)scanf("%d%d",&re[i].x,&re[i].y);
sort(re,re+n,cmp);
int sum = 0;int ma = -1;
for(int i=0;i<n;i++){sum+=re[i].x;ma = max(ma,sum+re[i].y);}//注意可能最长长度出现在中间。所以要边更新边判断。
printf("Case %d: %d\n",icase++,ma);
}
return 0;
}