1 条题解

  • 3
    @ 2024-4-28 15:35:05

    【题目大意】 田忌赛马已知你N匹马的速度以及田忌N匹马的速度,求出比赛中最多胜利几轮。

    【考纲知识点】贪心

    【解题思路】 田忌赛马的故事大家耳熟能详,是小学课文中一篇经典的课文,给大家很多方面的启迪,比如应该如何扬长避短,如何通过博弈论的思想,在自身条件不变的情况下,通过组合和排序的变化,积累局部的小胜为全局的胜利。

    而我们要计算按照田忌赛马的策略,最多可以胜利几轮,那我们可以先将你的马匹的速度和田忌马匹速度分别保存到这两个数组里,为了方便比较,可以先将这两个数组进行排序,都按从小到大排序。

    这里可以举个生活中大家方便理解的例子,比如你和小明打扑克比大小:

    你有3张牌:1 3 5

    小明有3张牌:2 4 6

    你们两个人的牌都是按从小到大排序的。小明比较笨,只会从最小的牌开始一张一张出。而你聪明多了。比如当小明出了牌2的时候,对于你来说,最佳的策略是出一张比2大一点的牌就够了,比如3,如果你出5那就是浪费火力了,3就足够管上了。

    小明接着出4,对于你来说,因为牌是按从小到大排列的,刚才管上2就得出3了,要想管上小明的4,你直接从自己3的位置往后找,看还有没有牌能大过4,只要大于4就出牌就对了。

    最后,你剩一张1,小明剩6,但是你总比分2:1赢了。

    上面这个打牌的思想,我们用代码来实现,就可以求出比赛中最多胜利几轮。

    【参考程序】

    #include <bits/stdc++.h>
    using namespace std;
    const int N = 100005;
    int a[N];
    int b[N];
    int n;
    int ans, h;
    int main()
    {
        cin >> n;
        // 将速度保存到数组中
        for (int i = 0; i < n; ++i)
        {
            cin >> a[i];
        }
        for (int i = 0; i < n; ++i)
        {
            cin >> b[i];
        }
        // 用sort函数对数组排序,默认从小到大排序
        sort(a, a + n);
        sort(b, b + n);
        
        for (int i = 0; i < n; i++)
        {
           // 注意b数组的索引h并不是每次循环都加1
            if (a[i] > b[h])
            {
                ans++;// 胜利次数加1
                h++;
            }
        }
        cout << ans;
        return 0;
    }
    
    • 1

    [GESP202312 四级] 田忌赛马

    信息

    ID
    572
    时间
    1000ms
    内存
    512MiB
    难度
    7
    标签
    递交数
    669
    已通过
    176
    上传者