7-275 简版田忌赛马

这是一个简版田忌赛马问题,具体如下:
田忌与齐王赛马,双方各有n匹马参赛,每场比赛赌注为200两黄金,现已知齐王与田忌的每匹马的速度,并且齐王肯定是按马的速度从快到慢出场,请写一个程序帮助田忌计算他最多赢多少两黄金(若输,则用负数表示)。
简单起见,保证2n匹马的速度均不相同。

输入格式:

首先输入一个正整数T,表示测试数据的组数,然后是T组测试数据。
每组测试数据输入3行,第一行是n(1≤n≤100) ,表示双方参赛马的数量,第2行n个正整数,表示田忌的马的速度,第3行n个正整数,表示齐王的马的速度。

输出格式:

对于每组测试数据,输出一行,包含一个整数,表示田忌最多赢多少两黄金。

输入样例:

4
3
92 83 71
95 87 74
2
20 25
21 12
10
1 2 3 24 5 6 7 8 9 12
11 13 15 19 22 34 14 21 44 99
4
10 15 16 37
14 20 30 40

输出样例:

200
400
-1200
0

代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB

思路

  1. 首先,通过变量 T 读取测试数据的组数。

  2. 进入循环,对每一组测试数据进行处理。对于每组数据,先读取变量 n,表示双方参赛马的数量。

  3. 动态分配内存创建两个数组 tianji 和 qiwang,分别用于存储田忌和齐王的马的速度。

  4. 使用 for 循环读取田忌的马的速度,并存储到数组 tianji 中。

  5. 使用 for 循环读取齐王的马的速度,并存储到数组 qiwang 中。

  6. 使用 qsort 函数对田忌和齐王的马的速度数组进行排序,以便后续比较。

  7. 初始化变量 tianjiIdx 和 qiwangIdx 为 0,用于记录当前比赛的马的索引。

  8. 初始化变量 win 为 0,用于记录田忌赢得的比赛场次。

  9. 使用 while 循环进行比赛,当田忌和齐王的马的索引都小于马的数量时进行比较。

  10. 如果田忌的马速度大于齐王的马速度,田忌赢了一场比赛,增加 win 的值,并将田忌和齐王的马的索引都加 1。

  11. 如果田忌的马速度小于齐王的马速度,齐王赢了一场比赛,将齐王的马的索引加 1。

  12. 如果田忌的马速度等于齐王的马速度,说明存在相同速度的马,为了避免重复比赛,将田忌的马的索引加 1。

  13. 计算田忌最多赢得的黄金数量,通过 (win - (n - win)) * 200 计算得到。

  14. 输出田忌最多赢得的黄金数量。

  15. 释放动态分配的内存,防止内存泄漏。

代码

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

// 比较函数,用于排序
int cmp(const void* a, const void* b) {
    return *(int*)b - *(int*)a;
}

int main() {
    int T;
    scanf("%d", &T);

    while (T--) {
        int n;
        scanf("%d", &n);

        int* tianji = (int*)malloc(n * sizeof(int)); // 田忌的马的速度数组
        int* qiwang = (int*)malloc(n * sizeof(int)); // 齐王的马的速度数组

        for (int i = 0; i < n; i++) {
            scanf("%d", &tianji[i]); // 读取田忌的马的速度
        }

        for (int i = 0; i < n; i++) {
            scanf("%d", &qiwang[i]); // 读取齐王的马的速度
        }

        qsort(tianji, n, sizeof(int), cmp); // 对田忌的马的速度进行排序
        qsort(qiwang, n, sizeof(int), cmp); // 对齐王的马的速度进行排序

        int tianjiIdx = 0; // 田忌马的速度数组的索引
        int qiwangIdx = 0; // 齐王马的速度数组的索引
        int win = 0; // 赢的数量

        while (tianjiIdx < n && qiwangIdx < n) {
            if (tianji[tianjiIdx] > qiwang[qiwangIdx]) {
                win++; // 田忌赢了一场比赛
                tianjiIdx++; // 田忌的下一匹马参赛
                qiwangIdx++; // 齐王的下一匹马参赛
            } else if (tianji[tianjiIdx] < qiwang[qiwangIdx]) {
                qiwangIdx++; // 齐王的下一匹马参赛
            } else {
                if (tianji[tianjiIdx] == qiwang[qiwangIdx]) {
                    tianjiIdx++; // 田忌的下一匹马参赛
                }
                qiwangIdx++; // 齐王的下一匹马参赛
            }
        }

        int total = (win - (n - win)) * 200; // 计算总数,每赢一场加200两黄金,每输一场扣200两黄金

        printf("%d\n", total); // 输出总数

        free(tianji); // 释放田忌马的速度数组的内存
        free(qiwang); // 释放齐王马的速度数组的内存
    }

    return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

吾乃宇宙欠债王

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

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

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

打赏作者

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

抵扣说明:

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

余额充值