UVA - 11729 Commando War

来自v_judge题目, 

      地址是:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=28436

      建议和1038. Recover the Smallest Number (30)一起看,思想上有相同之处

      你是一个长官,需要给n个士兵分配任务,对于士兵i,你解释这个任务需要t[i]的时间,士兵执行这个任务需要e[i]的时间,然后希望你找出最佳方案,使总的执行时间最短。

      总共有n!中可能,如果一开始就想着如何得到最终的结果,那会考虑得很痛苦,我们最好这样想,给你一个士兵的序列,如何去优化它,现在只考虑序列上两个相邻的士兵,Max是两个士兵执行完任务需要的时间,如果我们调换两个士兵的位置能使两个士兵的Max减少,那我们就算是优化了这个序列,尽管这种优化未必会对最终答案产生影响。可以证明这种优化是有传递性的,如果soldierA应当在soldierB,前面,soldierB应当在soldierC前面,那么soldierA也应当在soldierC,反复迭代,会获得一个无法再优化的序列。这就是最终的序列。

      但在解题时我们会直接排序。

# include <cstdio>
# include <algorithm>
using namespace std;

const int size = 1050;

struct soldier
{
   int brief,execute;    /*一直不知道brief还有动词用法,意为简要介绍,涨姿势了*/
   bool operator < (const soldier& cmper) const
   {
   	   int t1 = max(brief + execute,brief + cmper.brief + cmper.execute);
   	   int t2 = max(cmper.brief + cmper.execute,cmper.brief + brief + execute);
       return  t1 < t2; 
   }
};
soldier s[size];
int main()
{
    int i,j,k;
    int n,ncase = 0,Max;
    while (scanf("%d",&n)&&n)
      {
        for (i=0;i<n;i++)
            scanf("%d%d",&s[i].brief,&s[i].execute);
        sort(s,s+n);
        Max = s[0].brief + s[0].execute;
	    for (i=1;i<n;i++)
          {
		    s[i].brief += s[i-1].brief;
		    Max = max(Max,s[i].brief+s[i].execute);
		  }
        printf("Case %d: %d\n",++ncase,Max);
	  }
    return 0;
} 


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值