传送门:http://poj.org/problem?id=2785

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). 
 
 

给你一个数字n,然后有n组每组4个数,求每一列取出一个数,使最终四个数的和为0,求有多少种组合方式

 

解题思路:先求出来前两列和后两列的和,然后二分就可以了,对于这道题来说结果没有去重

 1 #include<vector>
 2 #include<set>
 3 #include<stdio.h>
 4 #include<algorithm>
 5 using namespace std;
 6 
 7 vector <int > a;
 8 vector <int > b;
 9 vector <int > c;
10 vector <int > d;
11 vector <int > sum1;
12 vector <int > sum2;
13 int main()
14 {
15     int n, i, j, a1, b1, c1, d1, sum;
16     while(scanf("%d", &n)!=EOF) {
17         sum = 0;
18         for(i = 0; i < n; i++)
19         {
20             scanf("%d%d%d%d", &a1, &b1, &c1, &d1);
21             a.push_back(a1);
22             b.push_back(b1);
23             c.push_back(c1);
24             d.push_back(d1);
25         }
26         for(i = 0; i < n; i++) {
27             for(j = 0; j < n; j++) {
28                 sum1.push_back(a[i] + b[j]);
29                 sum2.push_back(c[i] + d[j]);
30             }
31         }
32             
33     /*    for(i = 0; i < sum1.size(); i++) {
34             for(j = 0; j < sum2.size(); j++) {
35                 if(sum1[i]+sum2[j] == 0) {
36                     sum++;
37                 }
38             }
39         }*/
40         n = sum2.size();
41         sort(sum2.begin(),sum2.end());
42         
43         for(i = 0; i < n; i++) {
44             int l = 0, r = n-1, mid;
45             while(l <= r) {
46                 mid = (l + r) / 2;
47                 if(sum1[i] + sum2[mid] == 0) {
48                     sum++;
49                     for(j = mid + 1; j < n; j++) {
50                         if(sum1[i] + sum2[j] != 0) 
51                             break;
52                         else 
53                             sum++;
54                     }
55                     for(j = mid - 1; j >= 0; j--) {
56                         if(sum1[i] + sum2[j] != 0) 
57                             break;
58                         else 
59                             sum++;
60                     }
61                     break;
62                 }
63                 if(sum1[i] + sum2[mid] < 0) 
64                     l = mid + 1;
65                 else 
66                     r = mid - 1;
67             }
68         }
69         printf("%d\n", sum);
70     }
71     return 0;
72 }