版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
写在前面
- 思路分析
- 理解题意
- 把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; }