给定一个包含 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]较小者