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