PTA 7-275 简版田忌赛马

7-275 简版田忌赛马
分数 10
作者 usx程序设计类课程组
单位 绍兴文理学院
这是一个简版田忌赛马问题,具体如下:
田忌与齐王赛马,双方各有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

#include <stdio.h>
#include <stdlib.h>
#define N 100
int tian[N], qi[N];
void input(int arr[], int n);
int cmp(const void* a, const void* b);
int main() {
    int T, n, i = 0, j = 0;
    scanf("%d", &T);
    while (T--) {
        scanf("%d", &n);
        input(tian, n);
        input(qi, n);
        qsort(tian, n, sizeof(int), cmp); //升序
        qsort(qi, n, sizeof(int), cmp);
        int k1, k2, num = 0, sum = 0; //num代表比赛了几场,sum为总金额
        k1 = k2 = n - 1;
        while (num < n) {
            if (tian[k1] > qi[k2]) { //当田忌的马速大于齐王
                k1--;
                k2--;
                num++;
                sum += 200;
                continue;
            }
            else if (tian[k1] < qi[k2]) { //齐王大于田忌
                i++;
                k2--;
                num++;
                sum -= 200;
                continue;
            }
            else if (tian[k1] == qi[k2]) { //相等时
                if (tian[i] > qi[j])// 从前往后开始比
                {
                    sum += 200; //天兵获得200元钱
                    i++;
                    j++;
                    num++;
                    continue;
                }
                else {
                    if (tian[i] < qi[k2]) //田大于齐
                    {
                        sum -= 200;
                    }
                    i++;
                    k2--;
                    num++;
                    continue;
                }
            }
        }
        printf("%d", sum);
        if(T!=0){
            printf("\n");
        }
        memset(tian,0,N);  //重置
        memset(qi,0,N);
    }
    return 0;
}

void input(int arr[], int n) { //输入
    for (int i = 0;i < n;i++) {
        scanf("%d", &arr[i]);
    }
    return;
}
int cmp(const void* a, const void* b) { //比较
    return *(int*)a - *(int*)b; //升序
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值