田忌赛马-贪心算法实现

博客围绕田忌赛马问题,当马数量变为n匹时,设计算法助田忌赢最多银子。采用贪心算法,根据双方最快、最慢马的速度比较来安排比赛。给出C语言代码实现,还提醒输入数据时马速度需升序,若不是可加排序函数,并进行了结果演示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

田忌赛马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,结果演示

在这里插入图片描述

田忌赛马是中国古代的一个著名故事,讲述了田忌通过巧妙的策略在赛马中战胜齐威王的故事。在这个问题中,我们可以使用贪心算法来解决田忌赛马的问题。贪心算法是一种在每一步选择中都采取在当前状态下最好或最优(即最有利)的选择,从而希望导致结果是全局最好或最优的算法。 在田忌赛马问题中,假设田忌和齐威王各有n匹马,每匹马有一个速度值。我们需要找到一种策略,使得田忌在比赛中赢得最多的比赛场次。 贪心算法的思路如下: 1. 将田忌和齐威王的马按速度从快到慢排序。 2. 每次选择田忌最快的马与齐威王最快的马比较: - 如果田忌的马快,则赢得比赛,计数器加1。 - 如果齐威王的马快,则田忌输掉比赛,计数器减1。 - 如果速度相同,则不进行比赛。 以下是一个简单的Java代码示例,展示了如何使用贪心算法解决田忌赛马问题: ```java import java.util.Arrays; public class TianJiHorseRace { public static int maxWins(int[] tianJi, int[] qiWeiWang) { Arrays.sort(tianJi); Arrays.sort(qiWeiWang); int win = 0; int n = tianJi.length; int i = 0, j = 0, k = n - 1, l = k; while (i <= k) { if (tianJi[k] > qiWeiWang[l]) { win++; k--; l--; } else if (tianJi[i] > qiWeiWang[j]) { win++; i++; j++; } else { if (tianJi[i] < qiWeiWang[l]) { win--; } i++; l--; } } return win; } public static void main(String[] args) { int[] tianJi = {92, 83, 71, 64, 55}; int[] qiWeiWang = {95, 87, 74, 65, 53}; int result = maxWins(tianJi, qiWeiWang); System.out.println("田忌最多可以赢得的比赛场次: " + result); } } ``` 在这个示例中,我们首先将田忌和齐威王的马按速度从快到慢排序。然后,我们使用两个指针分别指向两匹马的最快和最慢位置。通过比较两匹马的速度,我们决定是赢得比赛、输掉比赛还是不进行比赛。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值