(二分)4 Values whose Sum is 0
2017-04-17 01:06
399 查看
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 2 28 ) 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
Sample Output
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>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int a[4010][6];
int s1[16000100];
int s2[16000100];
int n,k2=1;
int sum;
void judge(int a1)
{
int st=1;
int en=k2;
while(st<=en)
{
int l=(st+en)/2;
if(s2[l]==a1)
{
sum++;
for(int i=l+1;i<=k2;++i)
if(s2[i]==a1)
sum++;
else break;
for(int i=l-1;i>0;--i)
if(s2[i]==a1)
sum++;
else break;
return;
}
else if(a1<s2[l])
{
en=l-1;
}
else
{
st=l+1;
}
}
}
int main()
{
while(cin>>n)
{
int k1=1;
for(int i=1; i<=n; ++i)
for(int j=1; j<=4; ++j)
cin>>a[i][j];
for(int i=1; i<=n; ++i)
for(int j=1; j<=n; ++j)
s1[k1++]=a[i][1]+a[j][2];
for(int i=1; i<=n; ++i)
for(int j=1; j<=n; ++j)
s2[k2++]=a[i][3]+a[j][4];
sum=0;
sort(s2+1,s2+k2);
k2--;
for(int i=1; i<k1; ++i)
{
judge(-s1[i]);
}
printf("%d\n",sum);
}
}
+ 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 2 28 ) 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>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int a[4010][6];
int s1[16000100];
int s2[16000100];
int n,k2=1;
int sum;
void judge(int a1)
{
int st=1;
int en=k2;
while(st<=en)
{
int l=(st+en)/2;
if(s2[l]==a1)
{
sum++;
for(int i=l+1;i<=k2;++i)
if(s2[i]==a1)
sum++;
else break;
for(int i=l-1;i>0;--i)
if(s2[i]==a1)
sum++;
else break;
return;
}
else if(a1<s2[l])
{
en=l-1;
}
else
{
st=l+1;
}
}
}
int main()
{
while(cin>>n)
{
int k1=1;
for(int i=1; i<=n; ++i)
for(int j=1; j<=4; ++j)
cin>>a[i][j];
for(int i=1; i<=n; ++i)
for(int j=1; j<=n; ++j)
s1[k1++]=a[i][1]+a[j][2];
for(int i=1; i<=n; ++i)
for(int j=1; j<=n; ++j)
s2[k2++]=a[i][3]+a[j][4];
sum=0;
sort(s2+1,s2+k2);
k2--;
for(int i=1; i<k1; ++i)
{
judge(-s1[i]);
}
printf("%d\n",sum);
}
}
相关文章推荐
- POJ - 2785 4 Values whose Sum is 0 (二分)
- UVA - 1152 4 Values whose Sum is 0问题分解,二分查找
- POJ - 2785 : 4 Values whose Sum is 0(二分、STL上下界函数)
- Uva1152 4 Values whose Sum is 0 【中途相遇+二分】【例题8-3】
- POJ 2785 4 Values whose Sum is 0(二分)
- UVa1152 4 Values whose Sum is 0 (中途相遇法+二分)
- POJ 2785:4 Values whose Sum is 0 二分
- CSU-ACM2017暑假集训2-二分搜索 C - 4 Values whose Sum is 0
- POJ 2785 4 Values whose Sum is 0 二分
- (UVA - 11524) Values whose Sum is 0(二分+枚举)
- 4 Values whose Sum is 0+二分答案+POJ
- UVALive - 3506 4 Values whose Sum is 0 二分
- POJ 2785:4 Values whose Sum is 0 二分
- Poj 2785 4 Values whose Sum is 0【二分查找】
- POJ 2785 4 Values whose Sum is 0 二分
- 4 Values whose Sum is 0 POJ - 2785(二分查找)
- POJ 2785 4 Values whose Sum is 0 二分
- UVA 1152 4 Values whose Sum is 0 中途相遇法 二分查找
- 【折半枚举 && 二分】POJ - 2785 4 Values whose Sum is 0
- POJ 2785 4 Values whose Sum is 0 (对半分解 二分搜索)