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;
}

posted @ 2011-05-25 21:44  like@neu  阅读(372)  评论(0编辑  收藏  举报