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;
}
浙公网安备 33010602011771号