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;
}
大一的时候写的,现在从网易博客移过来~
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;
}
大一的时候写的,现在从网易博客移过来~
相关文章推荐
- 简单的四则运算
- 数的奇偶性
- ACM网址
- 1272 小希的迷宫
- 1272 小希的迷宫
- hdu 1250 大数相加并用数组储存
- 矩阵的乘法操作
- 蚂蚁爬行问题
- 蚂蚁爬行问题
- 求两个数的最大公约数【ACM基础题】
- 打印出二进制中所有1的位置
- 杭电题目---一只小蜜蜂
- HDOJ 1002 A + B Problem II (Big Numbers Addition)
- 初学ACM - 半数集(Half Set)问题 NOJ 1010 / FOJ 1207
- 初学ACM - 组合数学基础题目PKU 1833
- POJ ACM 1002
- POJ 2635 The Embarrassed Cryptographe
- POJ 3292 Semi-prime H-numbers
- POJ 2773 HAPPY 2006
- POJ 3090 Visible Lattice Points