1113 Integer Set Partition (25 分)
Given a set of NNN (>1> 1>1) positive integers, you are supposed to partition them into two disjoint sets A1A_1A1 and A2A_2A2 of n1n_1n1 and n2n_2n2 numbers, respectively. Let S1S_1S1 and S2S_2S2 denote the sums of all the numbers in A1A_1A1 and A2A_2A2, respectively. You are supposed to make the partition so that ∣n1−n2∣|n_1 - n_2|∣n1−n2∣ is minimized first, and then ∣S1−S2∣|S_1 - S_2|∣S1−S2∣ is maximized.
Input Specification:
Each input file contains one test case. For each case, the first line gives an integer NNN (2≤N≤1052 \le N \le 10^52≤N≤105), and then NNN positive integers follow in the next line, separated by spaces. It is guaranteed that all the integers and their sum are less than 2312^{31}231.
Output Specification:
For each case, print in a line two numbers: ∣n1−n2∣|n_1 - n_2|∣n1−n2∣ and ∣S1−S2∣|S_1 - S_2|∣S1−S2∣, separated by exactly one space.
Sample Input 1:
10
23 8 10 99 46 2333 46 1 666 555
Sample Output 1:
0 3611
Sample Input 2:
13
110 79 218 69 3721 100 29 135 2 6 13 5188 85
Sample Output 2:
1 9359
#include<iostream>
#include<string>
#include<vector>
#include<cmath>
#include<algorithm>
using namespace std;
int main(){
int n;
cin>>n;
vector<int> v(n);
for(int i = 0;i < n;i++){
cin >> v[i];
}
sort(v.begin(),v.end());
int cnt = 0;
if(n%2==0){
cnt = 0;
}else{
cnt=1;
}
int sum1 = 0,sum2 = 0;
for(int i = 0;i < n/2;i++){
sum1+=v[i];
}
for(int i = n/2;i < n;i++){
sum2+=v[i];
}
printf("%d %d\n",cnt,abs(sum1-sum2));
return 0;
}