CF489B 1200 *
题意
解析
如果对于一个 a 数列中的一个最小的数a[x],它可能和多个在 b 数列的数相匹配,显然,我需要先试试 b 数列中最小的一个 b[y],如果可行,那么赶紧配对,再试试 a 数列中第 2 小和 b 数列中第 2 小的;否则,如果 a[x] >b[y] 说明既然 b 数列最小的已经不行了,那么我们就要再次将最小的和 a 匹配,反之亦然,最后以此类推,发现只是一个不断找最小值的过程,所以就要先排序。
代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 200 + 10,M = 1e6 + 10;
int n,m,a[N],b[N];
int main(){
cin >> n;
for(int i=1;i<=n;i++){
cin >> a[i];
}
sort(a+1,a+1+n);
cin >> m;
for(int i=1;i<=m;i++){
cin >> b[i];
}
sort(b+1,b+1+m);
int pos1 = 1,pos2 = 1,res = 0;
while(pos1 <= n && pos2 <= m){
if(abs(a[pos1] - b[pos2]) <= 1){
res++;
pos1++;
pos2++;
}else if(a[pos1] < b[pos2] - 1) {
pos1++;
}else{
pos2++;
}
}
cout << res;
return 0;
}