B. Good Arrays

题目:

 

输入
6
3
6 1 2
2
1 1
4
3 1 2 4
1
17
5
1 2 1 1 1
3
618343152 819343431 1000000000

输出
YES
NO
YES
NO
NO
YES

思路:

        在这里,我们是可以使用 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;
}

 最后提交:

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值