田忌赛马-贪心算法实现

田忌赛马c语言代码实现

1,问题描述

你一定听说过田忌赛马的故事吧?如果3匹马变成n匹(n<=100),齐王仍然让他的马按照优到劣的顺序初赛,田忌可以按任意顺序选择他的赛马出赛。赢一局,田忌可以得到200两银子;输一局,田忌就要输掉200两银子。已知道国王和田忌的所有马的奔跑速度,并且所有马的奔跑速度均不相同,现已经对两人的马分别从快到慢排好序。请设计一个算法,帮助田忌赢得最多的银子。

2,算法分析

1、如果田忌最快的马比齐王最快的马快,则比之
2、如果田忌最快的马比齐王最快的马慢,则用田最慢的马跟齐最快的马比 //这是贪心的第一步
3、如果田忌最快的马的速度与齐威王最快的马速度相等
3.1、如果田忌最慢的比齐威王最慢的快,则比之 。 //这是贪心的第二步
3.2、如果田忌最慢的比齐威王最慢的慢,田忌慢VS齐王快
3.3、田忌最慢的与齐威王最慢的相等,田忌慢VS齐王快

3,代码实现(c语言)

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int n,i;
    printf("请输入马的数量:");
    scanf("%d",&n);
    int T[n],Q[n];

    printf("请输入田忌%d匹马的速度:",n);
    for(i=0; i<n; i++)
    {
        scanf("%d",&T[i]);
    }

    printf("请输入齐王%d匹马的速度:",n);
    for(i=0; i<n; i++)
    {
        scanf("%d",&Q[i]);
    }

    int WinTime=0,LostTime=0,j=0,q=0;
    int n1=n-1,n2=n-1,Money=0;
    while(1)
    {
        if(T[n1]>Q[n2])
        {
            WinTime+=1;
            printf("田忌速度为%d的马 VS 齐王速度为%d的马 !",T[n1],Q[n2]);
            n1=n1-1;
            n2=n2-1;
            printf(" 这场田忌赢了!1\n");
            Money=Money+200;
        }
        else if(T[n1]<Q[n2])
        {
           printf("田忌速度为%d的马 VS 齐王速度为%d的马 !",T[j],Q[n2]);
            LostTime+=1;
            j=j+1;
            n2=n2-1;
           printf(" 这场齐王赢了!2\n");
            Money=Money-200;
        }
        else if(T[n1]==Q[n2])
        {
            if(T[j]>Q[q])
            {
                WinTime+=1;
               printf("田忌速度为%d的马 VS 齐王速度为%d的马 !",T[j],Q[q]);
                j++;
                q++;
                printf(" 这场田忌赢了!3\n");
                Money=Money+200;
            }
            else if(T[j]<=Q[q])
            {
                LostTime+=1;
               printf("田忌速度为%d的马 VS 齐王速度为%d的马 !",T[j],Q[n2]);
                j++;
                n2--;
               printf(" 这场齐王赢了!4\n");
                Money=Money-200;

            }

        }
        if((LostTime+WinTime)==n)
        {
            if(WinTime>n/2)
            {
                printf("\nYES\n");
            }
            else
            {
                printf("\nNO\n");
            }
            printf("%d",Money);
            break;
        }
    }
    return 0;
}

4,注意事项

输入数据的时候,第一行为n(马的个数);第二、三行为田忌和齐王n匹马的速度(从小到大)
如果输入的数据不是升序的,可以自己在加一个排序的函数。

5,结果演示

在这里插入图片描述

  • 8
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值