Commando War UVA - 11729(机智)

题目大意:

一个将军要布置给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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值