1603整数集合的划分
一、问题描述
给定一个包含
N
N
N 个正整数的集合,请你将它划分为两个集合
A
1
A_1
A1 和
A
2
A_2
A2,其中
A
1
A_1
A1 包含
n
1
n_1
n1 个元素,
A
2
A_2
A2 包含
n
2
n_2
n2 个元素。集合中可以包含相同元素。用
S
1
S_1
S1 表示集合
A
1
A_1
A1 内所有元素之和,
S
2
S_2
S2 表示集合
A
2
A_2
A2 内所有元素之和.请你妥善划分,使得
∣
n
1
−
n
2
∣
|n_1−n_2|
∣n1−n2∣ 尽可能小,并在此基础上
∣
S
1
−
S
2
∣
|S_1−S_2|
∣S1−S2∣ 尽可能大。
输入格式
第一行包含整数
N
N
N ,第二行包含
N
N
N 个正整数。
输出格式
再一行中输出
∣
n
1
−
n
2
∣
|n_1−n_2|
∣n1−n2∣ 和
∣
S
1
−
S
2
∣
|S_1−S_2|
∣S1−S2∣,两数之间空格隔开。
数据范围
2≤
N
N
N≤105,
保证集合中各元素以及所有元素之和小于
2
31
2^{31}
231。
输入样例:
10
23 8 10 99 46 2333 46 1 666 555
输出样例:
0 3611
二、问题分析
本题用贪心的思想,首先将数组从小到大排序,若集合中元素个数为奇数,则将中间的数放到
n
2
n_2
n2中去,若为偶数则每个分集和各一半即可
代码如下(示例):
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
using namespace std;
int n,q[100010],sum,cnt;
int main()
{
cin>>n;
for(int i=0;i<n;i++)cin>>q[i];
sort(q,q+n);
if(n%2==0)
{
for(int i=0,j=n-1;i<j;i++,j--)sum+=q[j]-q[i];
}else
{
for(int i=0,j=n-2;i<j;i++,j--)
{
sum+=q[j]-q[i];
}
cnt++;
sum+=q[n-1];
}
cout<<cnt<<' '<<sum<<endl;
return 0;
}