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