#include <iostream>
#include <algorithm>
using namespace std;
const int N = 1e5 + 10;
int a[N];
int n;
// 奇数 n1 - n2 = 1 偶数 n1 - n2 = 0
int main (){
int s1 = 0, s2 = 0, s;
cin >> n;
for (int i = 0; i < n; i ++) cin >> a[i];
sort(a, a + n);
for (int i = 0; i < n >> 1; i ++) s1 += a[i]; //奇数前 s1 = 前n/2个数之和 s2 = 后面所有数之和; 偶数同样的代码
for (int i = n >> 1; i < n; i ++) s2 += a[i];
printf("%d %d", n % 2, s2 - s1); // 学习这样写n % 2直接就可以判断是否奇偶了,不用写if else
return 0;
}
使用vector写法以及前缀和思想:
核心思路
题目让两个集合的元素个数之差最小,数值总和之差最大。 所以划分两个集合的思路如下:
对所有元素 排个序, [0,n/2] ,[n/2,n] 分别作为两个集合。
受前缀和的启发: 数值总和之差 = 所有元素总和 - 两倍的[0,n/2]区间的总和。
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main()
{
vector<int> v;
int n, s = 0, x;
scanf("%d", &n);
for(int i = 0; i < n; i ++)
{
scanf("%d", &x);
v.push_back(x);
s += x;
}
sort(v.begin(), v.end());
for(int i = 0; i < n / 2; i++) s -= 2 * v[i];
if(n % 2 == 0) printf("0 %d", s);
else printf("1 %d", s);
return 0;
}
作者:帅小柏
链接:https://www.acwing.com/solution/content/31925/
来源:AcWing
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。