田忌赛马

来源:互联网 发布:mac 升级10.8 编辑:程序博客网 时间:2024/04/28 16:14

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

主要的思想有:

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


 

原创粉丝点击