HDU-非诚勿扰

这题用匈牙利算法是无论如何也过不了的,边太多了。

利用简单的贪心规则,我们每次选取最优的匹配方案来进行匹配,在划分上我们采用工资要求为负值的去寻找工资要求为正值的人。对于一个要求工资比他低的男人来说,其实就是优先最有钱的男人,因为能与之匹配的女生是最多的,在选取女生的时候,就选择满足要求下工资最高的女生,因为这种女生最难满足要求,这一对配对对后面的匹配来说是最优的。女生同理。

代码如下:

#include <cstring>

#include <cstdio>

#include <cstdlib>

#include <algorithm>

#define MAXN 100005

using namespace std;



int N, bl[MAXN], bh[MAXN], gl[MAXN], gh[MAXN];



int idx[5];



bool cmp(int a, int b)

{

    return a > b;

}



int solve()

{

    int ptr = 1, ret = 0;

    sort(bl+1, bl+1+idx[0], cmp);

    sort(bh+1, bh+1+idx[1], cmp);

    sort(gl+1, gl+1+idx[2], cmp);

    sort(gh+1, gh+1+idx[3], cmp);

    for (int i = 1; i <= idx[0]; ++i) {

        for ( ; ptr <= idx[3]; ++ptr) {

            if (bl[i] > gh[ptr]) {

                ++ptr, ++ret;

                break;

            }

        }

    }

    ptr = 1;

    for (int i = 1; i <= idx[2]; ++i) {

        for ( ; ptr <= idx[1]; ++ptr) {

            if (gl[i] > bh[ptr]) {

                ++ptr, ++ret;

                break;

            }

        }

    }

    return ret;

}



int main()

{

    int T, c;

    scanf("%d", &T);

    while (T--) {

        memset(idx, 0, sizeof (idx));

        scanf("%d", &N);

        for (int i = 1; i <= N; ++i) {

            scanf("%d", &c);

            if (c < 0) {

                bl[++idx[0]] = -c;

            }

            else {

                bh[++idx[1]] = c;

            }

        }  

        for (int i = 1; i <= N; ++i) {

            scanf("%d", &c);

            if (c < 0) {

                gl[++idx[2]] = -c;

            }

            else {

                gh[++idx[3]] = c;

            }

        }

        printf("%d\n", solve());

    }

    return 0;

}

你可能感兴趣的:(HDU)