题目:
|
|
思路:
在这里,我们是可以使用 a数组 中的元素的,只是要求我们 b 数组的元素下标所对应的 a 数组元素不能相等,它们的元素总和相等。
所以我们可以想一个思路就是,让 a 中不同元素之间位置调换作为 b 数组,然后判断对应的下标元素是否相同即可,对这个思路扩展,如果暴力肯定会 TLE
所以我们可以从 sum 入手,将它们的每个元素偏差一下的累加,如果大于等于零,说明可以进行调换元素位置或者添加一些新的元素的
代码详解如下:
#include <iostream>
#define endl '\n'
#define int long long
#define NO puts("NO")
#define YES puts("YES")
#define ___G std::ios::sync_with_stdio(false),cin.tie(0), cout.tie(0)
using namespace std;
inline void solve()
{
int n = 1;
cin >> n ;
if (n == 1)
{
// 特判如果数组大小只有 1
// 一定是 NO
// cin >> n 这里是去除输入缓冲
cin >> n;
NO;
return ;
}
// 记录偏差和
int sum = 0;
for (int i = 0, x; i < n; ++i)
{
cin >> x;
// 这里是累加我们的偏差
// 一般我们都偏差一个 1 即可
// 如果 我们的 x == 1 我们就偏差 2
if (x != 1)
sum += x - 1;
else
sum += x - 2;
}
// 如果我们偏差的累加大于零,说明我们可以调整顺序的
// 否则因为我们不能调整顺序,所以一定有 ai == bi 的情况
if (sum >= 0)
YES;
else
NO;
return;
}
signed main()
{
// freopen("a.txt", "r", stdin);
___G;
int _t;
cin >> _t;
while (_t--)
{
solve();
}
return 0;
}
最后提交: