算法篇:贪心算法解决田忌赛马问题

/*田忌赛马:贪心算法

问题分析

这是一道很经典的贪心算法入门题。 这道题贪心的思想是 要把每一匹马的作用发挥到最大,把已

方赢的概率增加到最大.

我是从双方慢马的角度来分析的,其实快马和慢马的思路差不多。

用田忌最慢的马与王最慢的马相比较:

1.如果田忌的慢马比王的慢马要快

果断把先用田忌的慢马先赢一把(这样赢是代价最小的)

2.如果田忌的慢马比王的慢马要慢

果断把这匹慢马与王最快的马比赛(因为反正都要输,这样我输的价值更大,因为我把最快的马比下去了,可

以增加后面其他马赢的机会)

3.如果田忌的慢马与王的慢马速度一样

->拿田忌最快的马和王最快的马比较

1)如果田忌快马比王快马快,那就拿这匹快马赢一局,之所以需要判断是因为我想让我最慢的马收益更大,如

果我的快马比王的快马快就没必要让慢马和这匹快马比了,我可以直接赢一盘。然后让我最慢的马去和王的一

匹比我剩下所有的马都要快的马比赛,这样我的慢马收益才是最大的。

2)如果田忌快马比王快马慢,那就拿田忌最慢的马与王最快的马比赛,这样的话我可以增加已方后面的马赢的

概率,因为你把最快的马拉走了.

*/

#include<cstdio>

#include<iostream>

#include<algorithm>

using namespace std;

int a[1005],b[1005];

int cmp(int x,int y)

{

    return x<y;

}

int main()

{

    int n;

    while(~scanf("%d",&n)&&n){

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

            cin>>a[i];

        }

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

            cin>>b[i];

        }

        sort(a,a+n,cmp);

        sort(b,b+n,cmp);

        //分别定义田忌和国王的快慢马 

        int cnt=0,t1=0,k1=0,t2=n-1,k2=n-1;

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

            if(a[t2]>b[k2]){//田快>王快 

                cnt+=200;

                t2--;

                k2--;

            }

            else if(a[t2]<b[k2]){// 田快<王快 

                cnt-=200;

                t1++;

                k2--;

            }

            else{//快马相等 ,比较慢马。

                if(a[t1]>b[k1]) {

                    cnt+=200;

                    t1++;

                    k1++;

                }

                else {

                    if(a[t1]<b[k2]){

                        cnt-=200;

                        t1++;

                        k2--;

                    }

                }

            }

        }

        cout<<cnt<<endl;

    }

    

    return 0;

}

参考链接:https://blog.csdn.net/weixin_46447561/article/details/105083909

                  https://www.jianshu.com/p/5d85cb3b7ed2

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

MingchenS

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

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

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

打赏作者

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

抵扣说明:

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

余额充值