您的位置:首页 > 产品设计 > UI/UE

Poj2785 (4 Values whose Sum is 0)

2016-02-25 09:26 295 查看
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
!=M && hash
!= t)
{
n=(n+key)%size;
}
hash
=t;
mark
++;
}
int find(int n)
{
int t=n;
n=(n+M)%size;
while(hash
!=M && hash
!= t)
{
n=(n+key)%size;
}
if(hash
== M) return 0;
else return mark
;
}
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;
}

大一的时候写的,现在从网易博客移过来~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Poj2785 ACM