用贪心法给下面题目写一个c代码:“田忌赛马”是历史上有名的揭示如何善用自己的长处去对付对手的短处,从而在竞技中获胜的事例。当时田忌和齐王赛马,他们各派出N匹马(N≤2000).每场比赛,输的一方要给赢的一方200两黄金,如果是平局的话,双方都不必拿出钱。\n每匹马的速度值是固定而且已知的,而齐王出马也不管田忌出马的顺序。请问田忌应该如何安排自己的马去对抗齐王的马,才能赢最多的钱?
时间: 2024-03-17 15:41:03 浏览: 105
以下是用贪心法解决“田忌赛马”问题的C语言代码:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_N 2000
int cmp(const void *a, const void *b) {
return *(int *)b - *(int *)a;
}
int main() {
int n;
int tian[MAX_N], qi[MAX_N];
int tian_start, tian_end, qi_start, qi_end;
int money;
while (scanf("%d", &n) != EOF) {
for (int i = 0; i < n; i++) {
scanf("%d", &tian[i]);
}
for (int i = 0; i < n; i++) {
scanf("%d", &qi[i]);
}
qsort(tian, n, sizeof(int), cmp);
qsort(qi, n, sizeof(int), cmp);
tian_start = tian_end = qi_start = qi_end = money = 0;
while (tian_start <= tian_end && qi_start <= qi_end) {
if (tian[tian_start] > qi[qi_start]) {
money += 200;
tian_start++;
qi_start++;
} else if (tian[tian_end] > qi[qi_end]) {
money += 200;
tian_end--;
qi_end--;
} else {
if (tian[tian_start] < qi[qi_end]) {
money -= 200;
}
tian_start++;
qi_end--;
}
}
printf("%d\n", money);
}
return 0;
}
```
该算法的思路是:将田忌和齐王的马按速度从大到小排序,然后从速度最快的马开始对比,如果田忌的马速度比齐王的马快,就选出最慢的田忌的马和最慢的齐王的马比赛;如果田忌的马速度比齐王的马慢,就选择最快的田忌的马和最慢的齐王的马比赛;如果速度相等,就选择最慢的田忌的马和最快的齐王的马比赛。最后统计田忌赢得的钱数即可。
阅读全文