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: 20015   Accepted: 5974
    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).

    Source

     
     
     
    解析:折半枚举。直接从4个数列中选择的话有n4种情况,时间复杂度太高,不可取。可以采取折半枚举的方式,将A、B、 C、 D分为AB和CD考虑,从A、B中取出a、b后,为了使总和为0则需要从C、D中取出c+d = -(a+b)。所以先将C、D取数的n2种方法枚举出来,并排好序,这样就可以运用二分搜索了,时间复杂度为O(n2logn2)。
     
     
     
    #include <cstdio>
    #include <algorithm>
    #include <vector>
    #define ll long long
    using namespace std;
    
    const int MAXN = 4000+5;
    int a[MAXN], b[MAXN], c[MAXN], d[MAXN];
    int cd[MAXN*MAXN];
    int n;
    pair<vector<int>::iterator, vector<int>::iterator> it;
    
    void solve()
    {
        for(int i = 0; i < n; ++i){
            for(int j = 0; j < n; ++j){
                cd[i*n+j] = c[i]+d[j];
            }
        }
        sort(cd, cd+n*n);
        ll res = 0;
        for(int i = 0; i < n; ++i){
            for(int j = 0; j < n; ++j){
                int c_d = -(a[i]+b[j]);
                it = equal_range(cd, cd+n*n, c_d);
                res += it.second-it.first;
            }
        }
        printf("%I64d
    ", res);
    }
    
    int main()
    {
        scanf("%d", &n);
        for(int i = 0; i < n; ++i)
            scanf("%d%d%d%d", &a[i], &b[i], &c[i], &d[i]);
        solve();
        return 0;
    }
    

      

      

  • 相关阅读:
    JDK10源码阅读--String
    [java大数据面试] 2018年4月百度面试经过+三面算法题:给定一个数组,求和为定值的所有组合.
    python scrapy爬取知乎问题和收藏夹下所有答案的内容和图片
    读取数据库信息并生成表设计文档Word版本
    怀念那时正规的软件开发流程
    eclipse安装java web插件
    webAPI+angularJS文件上传和下载
    .net整理
    怎么向老板解释你工作的价值?
    JS高级代码
  • 原文地址:https://www.cnblogs.com/inmoonlight/p/5758303.html
Copyright © 2011-2022 走看看