1113. Integer Set Partition (25)
题目大意
要求把一个集合分成两个不相交的集合,使得这两个集合的元素个数相差最小的前提下,两个集合的总和之差最大
基本思路
先把集合内n个元素排序,计算前n/2个元素的总和,然后用总的总和sum - 2 * halfsum即为 |S1 - S2|。
|n1 - n2|就是n % 2的结果,奇数为1,偶数为0。
注意:总和sum的值其实可以在输入的时候就累加得到。
代码
#include <bits/stdc++.h>
using namespace std;
int n,sum=0,halfSum=0;
vector<int> v;
int main(){
//输入
cin>>n;
v.resize(n);
for(int i=0;i<n;i++){
cin>>v[i];
sum=sum+v[i];
}
//排序
sort(v.begin(),v.end());
//得到一半元素的最大值
for(int i=0;i<n/2;i++){
halfSum=halfSum+v[i];
}
//输出
cout<<n%2<<" "<<sum-2*halfSum<<endl;
}