1 问题描述
给定四个数组,A,B,C,D,从每个数组找出取出一个元素,使得a+b+c+d=0。问满足条件的一共有多少组。
输入样例 第一行//每组元素的个数 剩下n行 //每组数组的元素
6
-45 22 42 -16
-41 -27 56 30
-36 53 -37 77
-36 30 -75 -46
26 -38 -10 62
-32 -54 -6 45
输出
6
2 分析
如果只有两组数,当取出一个数组的数值为a,则另一组数中只要有-a即可,因此变成一个查找问题。
同样的,将前两个数的数组之和(每个数组提一个元素)记为sum1,后两个数组之和(每个数组提一个元素)记为sum2,当sum2 = -sum1时,则满足条件。若有重复元素,则沿着数组计数求出元素的个数即可。
3 代码
int binsearch(const int t, const int len, int* sum1, int* sum2) {
//len为sum1和sum2的数组长度
int num = 0;
int left = 0, right = len - 1;
while (left < right) {
int mid = left + (right - left) / 2;
if (t <= sum2[mid])
right = mid;
else
left = mid + 1;
}//找到了
while (sum2[left] == t && left < len) {
num++;
left++;
}
return num;
}
void test() {
int N; //每个数组的元素个数
cin >> N;
int* arr = new int[N];
int* brr = new int[N];
int* crr = new int[N];
int* drr = new int[N];
int i = 0;
while (i < N) {
cin >> arr[i] >> brr[i] >> crr[i] >> drr[i];
i++;
}
int* sum1 = new int[N*N];
int* sum2 = new int[N*N];
int t = 0;
for (i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
sum1[t] = arr[i] + brr[j];
sum2[t] = crr[i] + drr[j];
t++;
}
}
//将sum1和sum2进行排序
sort(sum1, sum1 + t);
sort(sum2, sum2 + t);
int num = 0;
for (i = t - 1; i >= 0; i--)
num += binsearch(-sum1[i], N*N, sum1, sum2);
cout << num << endl;
}
int main() {
test();
system("pause");
return 0;
}