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;
}
posted @ 2022-12-30 00:11  Isaac233  阅读(23)  评论(0)    收藏  举报