题目364 田忌赛马

本文详细解析了著名的田忌赛马问题,通过逻辑分析找出最优策略,并提供了一段已经通过所有测试用例的代码实现,帮助读者深入理解该问题及其解决方案。

    已AC代码:

#include<cstdio>
#include<algorithm>
using namespace std;
int main()
{
    int n;
    while((scanf("%d", &n)) != EOF)
    {
        int t[n], k[n];
        int twin=0, kwin=0, pin=0;
        int tslow=0,kslow=0, tfast=n-1,kfast=n-1;
        for(int i=0; i<n; i++)
        {
            scanf("%d", &t[i]);
        }
        for(int i=0; i<n; i++)
        {
            scanf("%d", &k[i]);
        }
        sort(t, t+n);
        sort(k, k+n);
        for(int i=0; i<n; i++)
        {
            if(t[tslow] > k[kslow])
            {
                twin++;
                tslow++;
                kslow++;
            }
            else if(t[tslow] < k[kslow])
            {
                kwin++;
                tslow++;
                kfast--;
            }
            else
            {
                if(t[tfast] > k[kfast])
                {
                    twin++;
                    tfast--;
                    kfast--;
                }
                else if(t[tfast] < k[kfast])
                {
                    kwin++;
                    tslow++;
                    kfast--;
                }
                else
                {
                    if(t[tslow] < k[kfast])
                    {
                        kwin++;
                        tslow++;
                        kfast--;
                    }
                }
            }
        }
        //printf("%d %d %d\n", twin, kwin, pin);
        printf("%d\n", 200*(twin-kwin));
    }
    return 0;
}



P1650 田忌赛马是洛谷平台上的一道算法题目,以下是关于它的详细信息: ### 题目描述 这是一道以经典故事“田忌赛马”为背景的算法题。在该题中,田忌和齐王各有 $n$ 匹马参赛,每匹马都有一个固定的速度。比赛共进行 $n$ 场,每场比赛双方各出一匹马,速度快的马获胜,获胜方从输方得到 200 银币,若速度相同则双方均不损失也不获利。目标是让田忌在这 $n$ 场比赛中获得最多的银币。 ### 输入格式 第一行输入一个整数 $n$,代表双方马的数量。 第二行输入 $n$ 个整数,为田忌的马的速度。 第三行输入 $n$ 个整数,为齐王的马的速度。 ### 输出格式 输出一个整数,即田忌最多能获得的银币数。 ### 解题思路 该题可以使用贪心算法来解决,其核心思路如下: - 对田忌和齐王的马的速度分别进行排序。 - 比较双方最快的马: - 若田忌最快的马比齐王最快的马快,就让这两匹马比赛,田忌获胜。 - 若田忌最快的马比齐王最快的马慢,用田忌最慢的马和齐王最快的马比赛,田忌失败。 - 若二者速度相同,比较双方最慢的马: - 若田忌最慢的马比齐王最慢的马快,让这两匹马比赛,田忌获胜。 - 若田忌最慢的马比齐王最慢的马慢或相同,用田忌最慢的马和齐王最快的马比赛。 ### 示例代码(Python) ```python n = int(input()) tianji = sorted(map(int, input().split())) qiwang = sorted(map(int, input().split())) left_tian, right_tian = 0, n - 1 left_qi, right_qi = 0, n - 1 win = 0 for _ in range(n): if tianji[right_tian] > qiwang[right_qi]: win += 1 right_tian -= 1 right_qi -= 1 elif tianji[right_tian] < qiwang[right_qi]: win -= 1 left_tian += 1 right_qi -= 1 else: if tianji[left_tian] > qiwang[left_qi]: win += 1 left_tian += 1 left_qi += 1 else: if tianji[left_tian] < qiwang[right_qi]: win -= 1 left_tian += 1 right_qi -= 1 print(win * 200) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值