题意:
有m个男孩和n个女孩,每个人都有一个舞蹈熟练度,用一个不超过100的正整数来表示。
一个男孩和一个女孩能够结为舞伴当且仅当两人的熟练度相差不超过1.
问最多能结成多少对舞伴
分析:
这是一个二分图最大匹配问题,如果男孩和女孩满足条件则添加一条边,然后用匈牙利算法求最大匹配即可。
这是匈牙利算法的模板
http://www.cnblogs.com/AOQNRMGYXLMV/p/3950653.html
题解中还给了一种贪心的解法。将两边的熟练度排序,然后匹配。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <cstdio> 2 #include <cmath> 3 #include <cstring> 4 #include <algorithm> 5 using namespace std; 6 7 const int maxn = 100 + 10; 8 int a[maxn], b[maxn], line[maxn][maxn], used[maxn], girl[maxn]; 9 int n, m; 10 11 int main() 12 { 13 int cnt = 0; 14 scanf("%d", &n); 15 for(int i = 0; i < n; ++i) scanf("%d", &a[i]); 16 scanf("%d", &m); 17 for(int i = 0; i < m; ++i) scanf("%d", &b[i]); 18 sort(a, a + n); 19 sort(b, b + m); 20 for(int i = 0; i < n; ++i) 21 for(int j = 0; j < m; ++j) 22 { 23 if(abs(a[i] - b[j]) <= 1) 24 { 25 cnt++; 26 b[j] = 1000; //标记这个妹子有舞伴了 27 break; 28 } 29 } 30 31 printf("%d ", cnt); 32 33 return 0; 34 }