田忌赛马问题——贪心算法

关于输入

输入包含多组测试数据. 每组测试数据的第一行是一个整数n(1<=n<=1000),表示田忌和齐王都拥有n匹马。接下来一行是n个整数,表示田忌的马的速度,下一行也是n个整数,表示齐王的马的速度。 输入的最后以一个0表示结束。

关于输出

对每组数据,如果田忌能赢则输出“WIN”;如果田忌能输则输出“LOSE”;如果比赛平局则输出“DRAW”

解题思路: 算法可以用DP,或者给每匹马连线赋权变为二分图最佳匹配,还有就是贪心了。 1.当田忌最慢的马比齐王最慢的马快,赢一场先 2.当田忌最慢的马比齐王最慢的马慢,和齐王最快的马比,输一场 3.当田忌最快的马比齐王最快的马快时,赢一场先。 4.当田忌最快的马比齐王最快的马慢时,拿最慢的马和齐王最快的马比,输一场。 5.当田忌最快的马和齐王最快的马相等时,拿最慢的马来和齐王最快的马比

. 田忌赛马贪心的正确性证明

先说简单状况下的证明: 1.当田忌最慢的马比齐王最慢的马快,赢一场先。因为始终要赢齐王最慢的马,不如用最没用的马来赢它。 2.当田忌最慢的马比齐王最慢的马慢,和齐王最快的马比,输一场。因为田忌最慢的马始终要输的,不如用它来消耗齐王最有用的马。 3.当田忌最慢的和齐王最慢的马慢相等时,分4和5讨论。 4.当田忌最快的马比齐王最快的马快时,赢一场先。因为最快的马的用途就是来赢别人快的马,别人慢的马什么马都能赢。 5.当田忌最快的马比齐王最快的马慢时,拿最慢的马和齐王最快的马比,输一场,因为反正要输一场,不如拿最没用的马输。 6.当田忌最快的马和齐王最快的马相等时,这就要展开讨论了,贪心方法是,拿最慢的马来和齐王最快的马比. 前面的证明像公理样的,大家一看都能认同的,没有异议的,就不细说了。

证明:田忌最快的马和齐王最快的马相等时拿最慢的马来和齐王最快的马比有最优解。 可以举例来证明,比较容易理解。  

#include <iostream>

#include <algorithm>//使用sort函数要引用的头文件

using namespace std;

int main()

{

 int a[100000],b[100000],n,i,j;

 cin>>n;

 for(i=0;i<n;i++)

  cin>>a[i];

 for(j=0;j<n;j++)  

 cin>>b[j];

 sort(a,a+n);  //用函数sort(数组名,数组名+范围)使用sort函数要引用头文件#include <algorithm>且默认升序,限制是只能排int型和double型 不能排char型

sort(b,b+n);  

int win = 0;

  int fail = 0;  

int ib = 0, jb = 0;  

int ie = n - 1, je = n - 1;

  while (ib <= ie)  

{   

if (a[ie] > b[je])   //.当田忌最慢的马比齐王最慢的马快,赢一场先,因为始终要赢齐王最慢的马,不如用最没用的马来赢它

{  

 win++;  

 ie--;  

 je--;   

}

else if (a[ie] < b[je])   //当田忌最慢的马比齐王最慢的马慢,和齐王最快的马比,输一场。因为田忌最慢的马始终要输的,不如用它来消耗齐王最有用的马

{   

fail++;

  ie--;  

 jb++;  

  }

else   

{    

if (a[ib] > b[jb])   //当田忌最快的马比齐王最快的马快时,赢一场先。因为最快的马的用途就是来赢别人快的马,别人慢的马什么马都能赢。

  {

  win++;

  ib++;

  jb++;

    }

else    

{     

if (a[ie] < b[jb])//.当田忌最快的马比齐王最快的马慢时,拿最慢的马和齐王最快的马比,输一场

   fail++;  

 ie--;   

jb++;    

}   

}  

}  

if(win>fail)

  {   

cout<<"WIN";

  }

else   

if(win<fail)   

{    

cout<<"LOSE";

   }   

else     if(win=fail)   

  {     

cout<<"DRAW";  

   }  

 return 0;

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

คิดถึง643

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值