AcWing-1603.整数集合划分

给定一个包含 N 个正整数的集合,请你将它划分为两个集合 A1 和 A2,其中 A1 包含 n1 个元素,A2 包含 n2 个元素。

集合中可以包含相同元素。

用 S1 表示集合 A1 内所有元素之和,S2 表示集合 A2 内所有元素之和。

请你妥善划分,使得 |n1−n2| 尽可能小,并在此基础上 |S1−S2| 尽可能大。

输入格式
第一行包含整数 N。

第二行包含 N 个正整数。

输出格式
再一行中输出 |n1−n2| 和 |S1−S2|,两数之间空格隔开。

这道题因为是在|n1-n2|尽可能小的基础上在求|S1-S2|的最大值,因此我们将这n个数均分,所以如果n是偶数的话|n1-n2|=0,如果是奇数的话|n1-n2|=1;我们将数组按照升序进行排序,如果是n为偶数则可先求前n/2项的和,之后再求后n/2的和;如果n为奇数也是先求前n/2的和(因为n/2为整数),再求后n/2的和,因此无论是n为偶数还是奇数代码的中都是一样的。两和相见求出|S1-S2|的最大值。

#include<bits/stdc++.h>
using namespace std;
const int N = 100010;
int a[N];
int main()
{
    
    
	int n;
	cin>>n;
	int i;
	for(i=0;i<n;i++)
	{
    
    
		cin>>a[i];
	}
	sort(a,a+n);
	int sum1=0;
	int sum2=0;
	for(i=0;i<=n/2-1;i++)
	sum1+=a[i];
	for(i=n/2;i<n;i++)
	sum2=a[i];
	cout<<n%2<<" "<<sum2-sum1<<endl;
	return 0;
} 

猜你喜欢

转载自blog.csdn.net/weixin_51768569/article/details/113190820