这是一个简版田忌赛马问题,具体如下:
田忌与齐王赛马,双方各有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
思路
-
首先,通过变量
T
读取测试数据的组数。 -
进入循环,对每一组测试数据进行处理。对于每组数据,先读取变量
n
,表示双方参赛马的数量。 -
动态分配内存创建两个数组
tianji
和qiwang
,分别用于存储田忌和齐王的马的速度。 -
使用
for
循环读取田忌的马的速度,并存储到数组tianji
中。 -
使用
for
循环读取齐王的马的速度,并存储到数组qiwang
中。 -
使用
qsort
函数对田忌和齐王的马的速度数组进行排序,以便后续比较。 -
初始化变量
tianjiIdx
和qiwangIdx
为 0,用于记录当前比赛的马的索引。 -
初始化变量
win
为 0,用于记录田忌赢得的比赛场次。 -
使用
while
循环进行比赛,当田忌和齐王的马的索引都小于马的数量时进行比较。 -
如果田忌的马速度大于齐王的马速度,田忌赢了一场比赛,增加
win
的值,并将田忌和齐王的马的索引都加 1。 -
如果田忌的马速度小于齐王的马速度,齐王赢了一场比赛,将齐王的马的索引加 1。
-
如果田忌的马速度等于齐王的马速度,说明存在相同速度的马,为了避免重复比赛,将田忌的马的索引加 1。
-
计算田忌最多赢得的黄金数量,通过
(win - (n - win)) * 200
计算得到。 -
输出田忌最多赢得的黄金数量。
-
释放动态分配的内存,防止内存泄漏。
代码
#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;
}