POJ2287-Tian Ji -- The Horse Racing
原题链接:http://poj.org/problem?id=2287
田忌赛马的解法之一是贪心算法的变形,如果是朴素的贪心可能会出错,因为不满足直接贪心的条件。
提供一种解法如下:
(1)、对两个数组排序。
(2)、对田忌的马所在数组从小到大遍历,对每一匹马来说,可以找一个尽量大的对手并且击败对手。因此对王得马从大到小遍历,如果遇到比田忌的马速度慢的,则田忌赢一场,将双方的这两匹马标记为已访问。设赢t场。
(3)、对田忌的马再次遍历,对每一匹马遍历王得马的数组,寻找一匹没有使用的马使他们的速度相等。如果找到,双方的马标记为已访问。
(4)、对田忌或王的马遍历,设还没有访问的马的个数为k。
结果即为(t-k)*200。
#include <iostream> #include <string.h> #include <cstdio> #include <algorithm> using namespace std; #define N 1001 int main() { int a[N], b[N], n; while (scanf("%d", &n), n) { for (int i = 0; i < n; i++) scanf("%d", &a[i]); for (int j = 0; j < n; j++) scanf("%d", &b[j]); sort(a, a + n); sort(b, b + n); int tot = 0, fail = 0; bool v1[N], v2[N]; memset(v1, 0, sizeof(v1)); memset(v2, 0, sizeof(v2)); for (int i = 0; i < n; i++) { for (int j = n - 1; j >= 0; j--) { if (a[i] > b[j] && !v2[j]) { tot++; v1[i] = v2[j] = true; break; } } } for (int i = 0; i < n; i++) { if (!v1[i]) { bool temp = true; for (int j = 0; j < n; j++) if (!v2[j] && a[i] == b[j]) { v1[i] = v2[j] = true; temp = false; break; } if (temp)fail++; } } cout<<(tot - fail) * 200<<endl; } return 0; }