zoukankan      html  css  js  c++  java
  • POJ2785-4 Values whose Sum is 0

    传送门: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
    ", sum);
    70     }
    71     return 0;
    72 }
     
  • 相关阅读:
    没有上司的舞会
    邮票面值设计
    小木棍
    简单的试炼
    区间质数
    加工生产调度
    泥泞的道路
    总数统计
    中庸之道

  • 原文地址:https://www.cnblogs.com/ljmzzyk/p/7271894.html
Copyright © 2011-2022 走看看