描述
给定一个序列,将其划分为两个子序列,要求两个子序列所含元素个数的差值最小,且这两个序列和的差值最大。
分析
求出该序列第n/2小的元素,则前n/2个元素和剩余的元素构成的序列即满足要求。
求第n/2小的数详细过程:https://blog.csdn.net/qq_43643944/article/details/116069053?spm=1001.2014.3001.5501
#include <iostream>
using namespace std;
int Partiton(int a[], int left, int right) {//快速排序划分
int temp = a[left];
while (left < right) {
while (left < right && a[right] >= temp) right--;
a[left] = a[right];
while (left < right && a[left] <= temp) left++;
a[right] = a[left];
}
a[left] = temp;
return left;
}
void RandSelect_Min(int a[], int left, int right, int K) {//求第n/2小的元素
if (left < right) {
int pivot = Partiton(a, left, right);
if (pivot + 1 == K)
return;
else if (pivot + 1 < K)
RandSelect_Min(a, pivot + 1, right, K);
else
RandSelect_Min(a, left, pivot - 1, K);
}
}
int main() {
int S1 = 0, S2 = 0;
int a[] = {1, 6, 33, 18, 4, 0, 10, 5, 12, 7, 2, 9, 3, 25};
const int n = 14;//序列长度
RandSelect_Min(a, 0, n - 1, n / 2);
for (int i = 0; i < n; ++i) {//分别求两个子序列的和
if (i < n / 2)
S1 += a[i];
else
S2 += a[i];
}
cout << S2 - S1;
return 0;
}