zoukankan      html  css  js  c++  java
  • POJ-2785

    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

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

    题意:就是给你4组数,然后让你在每组数里面找一个数,使其4个数和为零。问你有多少组。

    题解:可以没两组数相加,和成两个数组,对其中一个数组排序。遍历两个数组(二分法,否则会TE),找相加为零的有多少组。

    AC代码为:

     1 #include <cstdio>  
     2 #include <iostream>  
     3 #include <cstring>  
     4 #include <algorithm>  
     5 using namespace std;
     6 
     7 
     8 int sum1[16000005], sum2[16000005];
     9 
    10 
    11 int main()
    12 {
    13 int n, mid;
    14 
    15 scanf("%d", &n);
    16 
    17 int a[n][4];
    18 for (int i = 0; i<n; i++)
    19 {
    20 scanf("%d%d%d%d", &a[i][0], &a[i][1], &a[i][2], &a[i][3]);
    21 }
    22 
    23 int k = 0;
    24 int m = 0;
    25 for (int i = 0; i<n; i++)
    26 for (int j = 0; j<n; j++)
    27 {
    28 sum1[k++] = a[i][0] + a[j][1];
    29 sum2[m++] = a[i][2] + a[j][3];
    30 }
    31 
    32 sort(sum2, sum2 + m);
    33 int cnt = 0;
    34 
    35 for (int i = 0; i<k; i++)
    36 {
    37 int left = 0;
    38 int right = k - 1;
    39 
    40 while (left <= right)
    41 {
    42 mid = (left + right) / 2;
    43 if (sum1[i] + sum2[mid] == 0)
    44 {
    45 cnt++;
    46 for (int j = mid + 1; j<k; j++)
    47 {
    48 if (sum1[i] + sum2[j] != 0)
    49 break;
    50 else
    51 cnt++;
    52 }
    53 for (int j = mid - 1; j >= 0; j--)
    54 {
    55 if (sum1[i] + sum2[j] != 0)
    56 break;
    57 else
    58 cnt++;
    59 }
    60 break;
    61 }
    62 
    63 if (sum1[i] + sum2[mid]<0)
    64 left = mid + 1;
    65 else
    66 right = mid - 1;
    67 }
    68 }
    69 cout<<cnt<<endl;
    70 
    71 return 0;
    72 }
    View Code
  • 相关阅读:
    技术博客之Saju M
    Dajax 的安装以及详细使用
    当我感觉厌倦的时候
    2014年3月22日 星期日
    windows 7远程桌面访问 ubuntu12.04
    promise的用法
    for循环中匿名同步
    开启Group Work Site功能
    Jquery根据属性模糊查询节点
    设置用户字段
  • 原文地址:https://www.cnblogs.com/csushl/p/9386615.html
Copyright © 2011-2022 走看看