zoukankan      html  css  js  c++  java
  • 田忌赛马问题——贪心算法

    关于输入

    输入包含多组测试数据. 每组测试数据的第一行是一个整数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;

    }

  • 相关阅读:
    利用string 字符串拷贝
    新手学vim配置
    进程描述符task_struct
    并查集
    堆Heap
    Bitset位图
    排序
    sql时间查询
    javascript 中的 call
    css 笔记——设置禁用中文输入法
  • 原文地址:https://www.cnblogs.com/iris-yx/p/3395580.html
Copyright © 2011-2022 走看看