NYOJ 364 田忌赛马

http://acm.nyist.net/JudgeOnline/problem.php?pid=364

这是一道经典的贪心算法的题目

主要的思想有:

1.当田忌最慢的马比齐王最慢的马快,赢一场先。因为始终要赢齐王最慢的马,不如用最没用的马来赢它。
2.当田忌最慢的马比齐王最慢的马慢,和齐王最快的马比,输一场。因为田忌最慢的马始终要输的,不如用它来消耗齐王最有用的马。
3.当田忌最慢的和齐王最慢的马慢相等时,分4和5讨论。
4.当田忌最快的马比齐王最快的马快时,赢一场先。因为最快的马的用途就是来赢别人快的马,别人慢的马什么马都能赢。
5.当田忌最快的马比齐王最快的马慢时,拿最慢的马和齐王最快的马比,输一场,因为反正要输一场,不如拿最没用的马输。
6.当田忌最快的马和齐王最快的马相等时,贪心方法是,拿最慢的马来和齐王最快的马比.
大笑应该是很好理解的吧,因此证明就.........

 
#include<stdio.h>
#include<algorithm>
int main()
{
 int n,m,i,j;
 int tian[1001],king[1001];
 while(scanf("%d",&n)!=EOF)
 {    
  for(i=0;i<n;i++)
   scanf("%d",&tian[i]);
  for(i=0;i<n;i++)
   scanf("%d",&king[i]);
  std::sort(tian,tian+n);
  std::sort(king,king+n);
  int win=0,lose=0;
  int m=n-1;
  n=n-1;
  i=0;j=0;       
        while(i<=n)
        {
            if(tian[i]<king[j])//田忌最慢比国王最慢还慢,就浪费国王的快马。。嘿嘿
              {
                i++;
                m--;
                lose++;          
            } 
   else if(tian[i]>king[j])//田忌最慢比国王最慢还快,不用考虑,赢他呀

             {
                win++;          
                i++;            
                j++;            
            }
   else              //田忌最慢与国王最慢相等,再考虑最快的之间比较,来判断怎么调用最慢的

   {
    if(tian[n]>king[m])     //田忌最快的比国王快,国王弱爆了,赢他。。
    { win++ ; n--; m--;}
    else
    {
     if(tian[i]<king[m])    //可能田忌最慢的比和国王最快的一样,因此此处才加这一句
      lose++;
     i++;
     m--;
    }
   }
  }
  printf("%d\n",200*(win-lose));
 }
 return 0;
}
     




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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值