您的位置:首页 > 其它

Commando War UVA - 11729(机智)

2017-09-25 21:19 239 查看
题目大意:

一个将军要布置给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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  机智题