📅  最后修改于: 2023-12-03 15:28:46.256000             🧑  作者: Mango
给出一组N个正整数(N <= 10^5),每个数字都不超过10^9,并按升序排列,然后两个数字X和Y分别分配到两个集合中。 值得注意的是,集合中的数字不能重复,并且集合中的元素数量必须相同。 我们希望使| X-Y |最小,并计算此值。
例如,输入数据为{1,2,4,7,11},我们可以将1,4和11分配到X中,2和7分配到Y中,所以| X-Y |为16。
实现函数int minimum_difference(int a[], int n)
,其中a[]包含N个元素,它们以递增顺序给出,函数应该返回X和Y之间的最小差异值。
Input: A[] = {1, 2, 4, 7, 11}
Output: 16
Explanation: We can put {1, 4, 11} in one set and {2, 7} in other set.
Input: A[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
Output: 1
Explanation: We can put {1, 3, 5, 7, 9} in one set and {2, 4, 6, 8, 10} in other set.
题目中明确要求将数组分成两个集合,并且集合中的元素数量必须相同。
根据题目中的例子,我们可以看到,当数组中的数字个数为偶数时,我们可以将两个集合分别分配到前后两个子数组中。在这种情况下,我们可以首先计算这两个子数组的元素的差异值。
例如,当输入数组A[] = {1, 2, 4, 7, 11}时,我们可以将其分为{1, 2, 4}和{7, 11}两个子数组,计算它们之间的差异值为| 7-1 | = 6和| 11-2 | = 9. 这两个数字的和为15,这并不是我们要的答案。
但是,我们可以发现,当集合的元素数量相等时,它们的和必须等于数组中所有数字的和的一半。 因此,在这种情况下,我们可以继续计算数组A[]的总和,并将其除以2得到所需的结果。
当数组中的数字为奇数时,我们可以将最后一个元素分配到任何一个集合中,并将数组分解成两个偶数的长度。然后,我们可以执行上述的分割策略,找到最小的差异值。
因此,最小的差异值即为两个子集合之间的最小差异值。
#include<bits/stdc++.h>
using namespace std;
int minimum_difference(int a[], int n) {
int total_sum = 0, current_sum = 0;
for (int i = 0; i < n; i++) {
total_sum += a[i];
}
for (int i = 0; i < n; i++) {
current_sum += a[i];
if (current_sum * 2 == total_sum) {
return 0;
}
else if (current_sum * 2 > total_sum) {
return min(abs((total_sum - current_sum) - current_sum), abs((total_sum - (current_sum - a[i])) - (current_sum - a[i])));
}
}
return -1;
}