zoukankan      html  css  js  c++  java
  • POJ:2785-4 Values whose Sum is 0(双向搜索)

    4 Values whose Sum is 0

    Time Limit: 15000MS Memory Limit: 228000K
    Total Submissions: 26974 Accepted: 8133
    Case Time Limit: 5000MS

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


    解题心得:

    1. 首先要明确跑四重循环不现实,所以正确的方法就是将每一组数分为两半,然后跑双向搜索。可以先得到前两个所有的总和,然后排序,在得到另外两个数的总和,得到的总和就可以在已经排好序的答案中去二分查找这样复杂度就变成了O(n^2logn)。

    #include <algorithm>
    #include <stdio.h>
    #include <cstring>
    using namespace std;
    const int maxn = 4010;
    const int maxm = 2e7+100;
    
    int a1[maxn],a2[maxn],a3[maxn],a4[maxn],n;
    int sum[maxm];
    
    void init() {
        scanf("%d",&n);
        for(int i=0;i<n;i++)
            scanf("%d%d%d%d",&a1[i],&a2[i],&a3[i],&a4[i]);
    }
    
    int get_sum() {
        int T = 0;
        for(int i=0;i<n;i++) {
            for(int j=0;j<n;j++) {
                sum[T++] = a1[i] + a2[j];
            }
        }
        sort(sum,sum+T);
        return T;
    }
    
    long long solve(int len) {
        int ans = 0;
        for(int i=0;i<n;i++) {
            for(int j=0;j<n;j++) {
                int k = a3[i] + a4[j];
                k = -k;
                ans += upper_bound(sum,sum+len,k) - lower_bound(sum,sum+len,k);
            }
        }
        return ans;
    }
    
    int main() {
        init();
        int len = get_sum();
        long long ans = solve(len);
        printf("%lld
    ",ans);
        return 0;
    }
  • 相关阅读:
    spring aop
    spring Mybatis集成
    springDao的jdbctemplate
    spark介绍4(sparksql)ODBC(Windows)gc
    ssm集合的配置
    scala文件流操作,生成sparkpv,uv作业文件
    java数据库操作
    vue一键打包部署
    Vue 那些事
    CDN合集
  • 原文地址:https://www.cnblogs.com/GoldenFingers/p/9107102.html
Copyright © 2011-2022 走看看