作者 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
c语言代码解析如下
#include <stdio.h>
int main() {
int t;
scanf("%d", &t);
for (int i = 0; i < t; i++) {
int n;
scanf("%d", &n);//接收个数
int tian[n], qi[n];
for (int j = 0; j < n; j++) {
scanf("%d", &tian[j]);//接收tianji马的速度
}
for (int j = 0; j < n; j++) {
scanf("%d", &qi[j]);//接收qi马的速度
}
//对这两组数据同时进行排序
for (int j = 0; j < n - 1; j++) {
for (int k = 0; k < n - j - 1; k++) {
if (tian[k] > tian[k + 1]) {
// 交换tian[k]和tian[k+1]
int temp = tian[k];
tian[k] = tian[k + 1];
tian[k + 1] = temp;
}
if (qi[k] > qi[k + 1]) {
// 交换qi[k]和qi[k+1]
int temp = qi[k];
qi[k] = qi[k + 1];
qi[k + 1] = temp;
}
}
}
//开始遍历
int x = 0;
int y = 0;
int count = 0;
for (x = 0; x < n; x++) {
for (y = 0; y < n;) {
if (tian[y] > qi[x]) {
y += 1;
count += 1;
break;
} else {
y += 1;
}
}
if (y == n) {
break; // 田忌所有的马都不能赢
}
}
printf("%d\n", count * 200 - (n - count) * 200);
}
return 0;
}
python代码的解析如下
t = int(input())
for i in range(t):
n = int(input())
tian = list(map(int, input().split())) # 田忌马的速度
qi = list(map(int, input().split())) # 齐王马的速度
tian.sort()
qi.sort()
x = 0
y = 0
count = 0
for x in range(n):
for y in range(n): # 找到田忌比齐王最弱的马强的下标,齐马增加,田的马从y开始
if tian[y] > qi[x]:
y += 1
count += 1
break
else:
y += 1
if y == n:
break # 田忌所有的马都不能赢
print(count*200 - (n-count)*200)