写在前面
- 思路分析
- 理解题意
- 把1个集合分成两个不相交集合,使得2个集合元素个数相差最小,2个集合总和之差最大
- 逻辑分析
- 把集合内n个元素排序,计算前n/2个元素总和,用总和sum – 2 * halfsum即为 |S1– S2|
- |n1 – n2|就是n % 2的结果,奇数为1,偶数为0
- 题目简单,10分钟a题
- 略水
测试用例
input:
10
23 8 10 99 46 2333 46 1 666 555
output:
0 3611
input:
13
110 79 218 69 3721 100 29 135 2 6 13 5188 85
output:
1 9359
ac代码
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main()
{
int n, sum = 0, halfsum = 0;
scanf("%d", &n);
for(int i=0; i<n; i++)
{
scanf("%d", &v[i]);
sum += v[i];
}
sort(v.begin(), v.end());
for(int i=0; i<n/2; i++)
halfsum += v[i];
// 累加1次,做差1次
printf("%d %d", n%2, sum-2*halfsum);
return 0;
}