codeforces 题目 Two Arrays

本文介绍了一种方法,解决给定数组如何划分成两组,使得不幸值(元素和等于给定值T的配对)之和最小。策略基于将元素分为小于T/2,等于T/2,大于T/2三类。给出了C++代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

题目:

题目理解:

思路:

AC代码:


题目:

题目理解:

给你长度为 n 的数组,你需要将原数组分成两组,这两组的不幸值的和是所有分组情况的最低。

不幸值:组中( 任意两个不重叠的位置的数值的和等于题目所给的 T )的个数

你需要返回一个与原数组等长的 01数组,代表着原数组如何分成两组(位置上为 0 的一组,位置上为 1 的另一组)

思路:

首先想一个问题,什么时候才能让组中任意两个的和尽可能不等于 T?

不难想到要么组里面的数都特别大,或者都特别小的时候就可以,那么边界在哪里?就是 T ÷ 2 。

再加上题目并没有要求两个组是否要均匀分配,那么我们可以进行如下操作:

严格小于 T ÷ 2 的分为一组,这样这个组内任意两个的和都必小于 T ,

严格大于 T ÷ 2 的放到另一组,这样这个组内任意两个的和都必大于 T

严格等于 T ÷ 2 的尽可能的均匀分到两个组,这样只有当一个组内有多个(严格等于 T ÷ 2 )的元素的时候才会有不幸值,且此时不幸值最少

思路有了,具体操作请看AC代码:

AC代码:

#include<bits/stdc++.h>
using namespace std;

typedef long long ll;

const int N = 1e5 + 5;

int a[N];//原数组
int b[N];//分配后的数组

int main()
{
	std::ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);

	int t;
	cin >> t;

	while (t--)
	{
		int n, k;
		cin >> n >> k;

		for (int i = 1; i <= n; i++)
			cin >> a[i];

		int flag = 0;//用于平均分配( 严格等于 T ÷ 2 )的情况

		for (int i = 1; i <= n; i++)
		{
			if (a[i] + a[i] < k)//( 严格小于 T ÷ 2 )的情况
				b[i] = 1;
			else if (a[i] + a[i] > k)//( 严格大于 T ÷ 2 )的情况
				b[i] = 0;
			else//( 严格等于 T ÷ 2 )的情况
			{
				if (flag)
				{
					flag = 0;
					b[i] = 1;
				}
				else
				{
					flag = 1;
					b[i] = 0;
				}
			}
		}
		for (int i = 1; i <= n; i++)
			cout << b[i] << " ";
		cout << '\n';
	}
	return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值