0
点赞
收藏
分享

微信扫一扫

AcWing 1603. 整数集合划分

zibianqu 2022-01-20 阅读 57
c++前缀和

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

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

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

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

第一行包含整数 N。

第二行包含 N 个正整数。

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

2≤N≤10^5,
保证集合中各元素以及所有元素之和小于 231。

输入样例1:

10
23 8 10 99 46 2333 46 1 666 555

输出样例1:

0 3611

输入样例2:

13
110 79 218 69 3721 100 29 135 2 6 13 5188 85

输出样例2:

1 9359
#include<iostream>
#include<algorithm>
#define N 1000000
int a[N];//前缀和数组构造 
int s[N]; 
using namespace std;
int main()
{
	int n;
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
	}
	sort(a+1,a+1+n);//先排序 
	for(int i=1;i<=n;i++)//后构造前缀和数组 
	{
		s[i]=s[i-1]+a[i];
	}
	if(n%2==0)//若为偶数元素数 
	{
		printf("0 %d",s[n]-s[n/2]*2);
	}
	else//若为奇数元素数 
	{
		printf("1 %d",s[n]-s[n/2]*2);
	}
	return 0;
}

 s1=s[n]-s[n/2]较大者

s2=s[n/2]较小者

举报

相关推荐

0 条评论