1113 Integer Set Partition (25分)
Given a set of N (>1) positive integers, you are supposed to partition them into two disjoint sets A
1
and A
2
of n
1
and n
2
numbers, respectively. Let S
1
and S
2
denote the sums of all the numbers in A
1
and A
2
, respectively. You are supposed to make the partition so that ∣n
1
−n
2
∣ is minimized first, and then ∣S
1
−S
2
∣ is maximized.
Input Specification:
Each input file contains one test case. For each case, the first line gives an integer N (2≤N≤10
5
), and then N positive integers follow in the next line, separated by spaces. It is guaranteed that all the integers and their sum are less than 2
31
.
Output Specification:
For each case, print in a line two numbers: ∣n
1
−n
2
∣ and ∣S
1
−S
2
∣, 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 <vector>
#include<algorithm>
#include <cmath>
#include<map>
#include<cstring>
#include<queue>
#include<string>
#include<set>
#include<stack>
using namespace std;
typedef long long ll;
const int maxn=100010,inf=100000000;
int main(){
int n;ll a[maxn],ans=0;
cin>>n;
for(int i=0;i<n;i++){
cin>>a[i];
}
sort(a,a+n);
if(n%2==0) cout<<"0 ";
else cout<<"1 ";
for(int i=0;i<n/2;i++){
ans-=a[i];
}
for(int i=n/2;i<n;i++) ans+=a[i];
cout<<ans<<endl;
}

浙公网安备 33010602011771号