Description
The SUM problem can be formulated as follows: given four lists A, B, C, D of integer values, compute how many quadruplet (a, b, c, d ) ∈ A x B x C x D are such that a + b + c + d = 0 . In the following, we assume that all lists have the same size n .
Input
The first line of the input file contains the size of the lists n (this value can be as large as 4000). We then have n lines containing four integer values (with absolute value as large as 228 ) that belong respectively to A, B, C and D .
Output
For each input file, your program has to write the number quadruplets whose sum is zero.
Sample Input
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
Sample Output
5
Hint
Sample Explanation: Indeed, the sum of the five following quadruplets is zero: (-45, -27, 42, 30), (26, 30, -10, -46), (-32, 22, 56, -46),(-32, 30, -75, 77), (-32, -54, 56, 30).
简要思路:将四个数分成两个部分。一、将前两个数求和,创建哈希数组;二、求出后两个数的和的相反数,在哈希数组中查找。
源代码:(哈希)
#include <iostream>
using namespace std;
const int size=21835456; //哈希表数组大小
const int M=1000000000; //让取到的值皆有正数
const int key=1357; //发生冲突时
int hash[size],mark[size];
int a[4001],b[4001],c[4001],d[4001];
void insert(int n)
{
int t=n;
n=(n+M)%size;
while(hash[n] !=M && hash[n] != t)
{
n=(n+key)%size;
}
hash[n]=t;
mark[n]++;
}
int find(int n)
{
int t=n;
n=(n+M)%size;
while(hash[n] !=M && hash[n] != t)
{
n=(n+key)%size;
}
if(hash[n] == M) return 0;
else return mark[n];
}
int main()
{
int count = 0;
int n,i,j;
scanf("%d",&n);
for(i=1; i<=n; i++)
{
scanf("%d %d %d %d",&a[i],&b[i],&c[i],&d[i]);
}
for(i=1;i<=size;i++)
{
hash[i] = M;
mark[i]=0;
}
for(i = 1; i<=n; i++)
for(j = 1; j<=n; j++)
insert(a[i]+b[j]);
for(i = 1; i<=n; i++)
for(j = 1; j<=n; j++)
{
count +=find(-(c[i]+d[j]));
}
printf("%d\n",count);
return 0;
}
大一的时候写的,现在从网易博客移过来~