题意:给定一系列数,然后把数分为两个集合,首先满足两个集合的个数只差最小,即非0即1,然后保证两个集合的和之差最大,求这样的个数之差最大,和之差最小
思路:两个集合的个数最小,非0即1(偶为0,奇为1),要两个集合的总和之差最大,一定是大的一半减去小的一半即可以得到最大的和,如果是奇数个的话,把多的那一个大的放到大的集合中去,保证和之差最大。sum为总和,halfsum为小集合的和,sum-2*halfsum则是两集合只差的最大值
代码:
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
int main() {
int n = 0, sum = 0,halfsum = 0;
cin >> n;
vector<int> p(n);
for (int i = 0; i < n; i++) {
scanf("%d",&p[i]);
sum += p[i];
}
sort(p.begin(),p.end());//按从小到大的顺序排列
for (int i = 0; i < p.size()/2; i++) {
halfsum += p[i];//小的那一半的和
}
printf("%d %d\n", n % 2 , sum - 2 * halfsum);//sum是总的和,half为小一半的和
system("pause");
return 0;
}