田忌赛马 简单贪心

本文介绍了田忌赛马的经典问题,以及如何运用贪心策略进行优化。通过比较田忌和国王马的速度,采取先赢或先输的策略,确保在三场比赛中获得胜利。具体策略包括:当田忌的快马能胜国王快马时,优先出快马;反之,田忌用慢马对阵国王快马,以此类推。
摘要由CSDN通过智能技术生成
终于遇到一道值得题解报告的题了,这是道贪心的题,在杭电提交了13次10次是WA, 仔细想想,觉得还是思考的方向不对后来百度了下终于大彻大悟,百度上的基本是用C++实现,自己用C语言写了个,先来算法吧:
    题目大意:田忌和国王赛马,给出马的数量n,然后是田忌的n匹马,国王的n匹马。问田忌最多可以赢得多少比赛(一场200块)。

因为比赛的时候,是国王先出马,然后田忌再出,田忌有主动权上的优势。

先对田忌和国王的马进行排序。

贪心的策略:

一、当田忌最快的马比国王最快的马快时,用田忌最快的马赢国王最快的马。
二、当田忌最快的马比国王最快的马慢时,用田忌最慢的马输给国王最快的马。

三、当田忌最快的马跟国王最快的马一样快时,分情况:
     
1、当田忌最慢的马比国王最慢的马快,那么用田忌最慢的马赢国王最慢的马

     2、当田忌最慢的马比国王最慢的马慢,那么用田忌最慢的马输给国王最快的马

     3、当田忌最慢的马跟国王最慢的马相等的时候,用田忌最慢的马跟国王最快的马比

下面是网上的证明:
证明一、:假设现在国王最快的马是K,田忌最快的马是T,如果存在一种更优的比赛策略,让T的对手不是K,而使得田忌赢更多的钱的话,那么设此时K的对手是t,T的对手是k:( T>K &&T>t && K>k)
1、 若t>K,则有T>k,t>K。这个结果和T>K,t>k是相同的。
2、 若k<t≤K,则有T>k,t≤K。这个结果不如T>K,t>k来得优秀。
3、 若t≤k≤K,则有T>k,t≤K。这个结果和T>K,t≤k是相同的。
由此可知,交换各自对手后,一定不会使得结果变劣,那么假设是不成立的。

证明二、:因为田忌最快的马比国王最快的马慢,所以田忌所有的马都比国王最快的马慢,也就是说此时田忌的所有马都赢不了国王的马,而出于贪心的思想,应该保留相比之下更快的马,因此用最慢的马去输一定不会比用别的马去输来得劣。
其实上面这两个很容易就想得到,最难的是相等的时候。因为不可以直接让田忌最快的马跟国王最快的马打平,或者直接用最慢的马去输给国王最快的马。(存在反例)

下面是我的代码:
  
#include<stdio.h>
 
void  swap (int * a ,int * b )
    {

        int
 temp = * a
        (*
a ) = (* b );
        (*
b ) =  temp ;
    }
 
int main()
{

    int
 n , i , k , mina ,
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值