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;
}
     




你可能感兴趣的:(NYOJ 364 田忌赛马)