CF1584C Two Arrays 题解

题意

给两个长度为 $n$ 的数组 $A,B$。

现在可以从 $A$ 中选 $k$ 个数,把 $a_i$ 改为 $a_i+1$。

然后可以把 $A$ 任意打乱,问操作后 $A$ 是否可以变成 $B$。

思路

显然,如果可以把 $A$ 变为 $B$,

那么在选取 $k$ 个数加一后,$A$ 与 $B$ 可以一一对应

所以,只需要把两个数组排序,使应该对应的数相互对应。

然后判断两个数组中,两个数是否对应即可。

考虑两个数对应的条件,

因为这 $k$ 个数可以任意选,所以 $a_i=b_i$ 或 $a_i+1=b_i$ 都是对应的。

那么,只要有一对数不对应,$A$ 就不能变为 $B$。

代码

#include <iostream>
#include <algorithm>
using namespace std;
int t, n, a[150], b[150];
int main()
{
    cin >> t;
    while(t--)
    {
        cin >> n;bool f = 0;
        for(int i = 0;i < n;++i)
            cin >> a[i];
        for(int i = 0;i < n;++i)
            cin >> b[i];
        sort(a, a + n);sort(b, b + n);
        for(int i = 0;i < n;++i)
            if(b[i] != a[i] && b[i] != a[i] + 1)
            {
                cout << "NO" << endl;f = 1;break;
            }
        if(!f) cout << "YES" << endl;
    }
    return 0;
}
posted @ 2021-12-17 15:26  5k_sync_closer  阅读(1)  评论(0编辑  收藏  举报  来源