要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小。
例如:
var a=[100,99,98,1,2, 3];
var b=[1, 2, 3, 4,5,40]。
int cmp(const void *a, const void *b) {
return *(int *) a - *(int *) b;
}
int sum(int*a, int len) {
int temp = 0;
for (int i = 0; i < len; ++i) {
temp += a[i];
}
return temp;
}
void printArr(int*a, int* b, int len) {
for (int i = 0; i < len; ++i)
cout << a[i] << " ";
cout << endl;
for (int i = 0; i < len; ++i)
cout << b[i] << " ";
cout << endl;
}
void Arrange(int a1[], int a2[], int len) {
int *a3 = new int[2 * len];
//合并序列
for (int i = 0; i < len; ++i) {
a3[i] = a1[i];
a3[i + len] = a2[i];
}
//升序快排
qsort(a3, 2 * len, sizeof(int), cmp);
//排序后的拆分序列
for (int i = 0; i < len; ++i) {
a1[i] = a3[i];
a2[i] = a3[i + len];
}
bool isSwap = false;
int prevDif = sum(a2, len) - sum(a1, len); //存储上一次运算的差值。
while (true) {
for (int i = 0; i < len; ++i) {
int curDif = prevDif - 2 * a2[i] + 2 * a1[i];
//交换当前项后和的差值绝对值变小
if (abs(curDif) < abs(prevDif)) {
swap(a1[i], a2[i]);
prevDif = curDif;
isSwap = true;
//找到最佳值
}
if (curDif == 0)
return;
}
if (!isSwap)
return;
//重新排序
qsort(a1, len, sizeof(int), cmp);
qsort(a2, len, sizeof(int), cmp);
isSwap = false;
}
}