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; //升序
}