• 哈希-4 Values whose Sum is 0 分类: POJ 哈希 2015-08-07 09:51 3人阅读 评论(0) 收藏


    4 Values whose Sum is 0
    Time Limit: 15000MS Memory Limit: 228000K
    Total Submissions: 17875 Accepted: 5255
    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
    Southwestern Europe 2005
    哈希的一道比较简单的题,
    题意:给你四个集合,从四个集合中分别选出一个元素,使四个元素的和为零,问有几种选法;
    方法:先让两个集合加和,用哈希链表,储存计算的结果,有后两个集合的计算结果查找,不过直接写链表可能比较耗时,我交了一次11s多,后来换成前向星3s多.

    #include <map>
    #include <set>
    #include <list>
    #include <cmath>
    #include <queue>
    #include <stack>
    #include <vector>
    #include <string>
    #include <cstdio>
    #include <cstring>
    #include <cstdlib>
    #include <iostream>
    #include <algorithm>
    using namespace std;
    #define eps 1e-9
    #define LL long long
    #define PI acos(-1.0)
    #define INF 0x3f3f3f3f
    #define CRR fclose(stdin)
    #define CWW fclose(stdout)
    #define RR freopen("input.txt","r",stdin)
    #define WW freopen("output.txt","w",stdout)
    
    const int MAX = 4010;
    
    const int Mod = 10000007;
    struct node
    {
        int num;
        int data;
        int next;
    } H[Mod*10];
    int head[Mod];
    int a[MAX],b[MAX],c[MAX],d[MAX];
    int top;
    int Creat(int ans)
    {
        H[top].num=1;
        H[top].data=ans;
        return top++;
    }
    int main()
    {
        int n;
        int ans;
        int p,q;
        int Max;
        while(~scanf("%d",&n))
        {
            memset(head,-1,sizeof(head));
            for(int i=0; i<n; i++)
            {
                scanf("%d %d %d %d",&a[i],&b[i],&c[i],&d[i]);
            }
            top=0;
            for(int i=0; i<n; i++)
            {
                for(int j=0; j<n; j++)
                {
                    ans=a[i]+b[j];
                    p=abs(ans)%Mod;
                    q=head[p];
                    while(q!=-1)
                    {
                        if(H[q].data==ans)
                        {
                            H[q].num++;
                            break;
                        }
                        q=H[q].next;
                    }
                    if(q==-1)
                    {
                        q=Creat(ans);
                        H[q].next=head[p];
                        head[p]=q;
                    }
                }
            }
            Max=0;
            for(int i=0; i<n; i++)
            {
                for(int j=0; j<n; j++)
                {
                    ans=-1*(c[i]+d[j]);
                    p=abs(ans)%Mod;
                    q=head[p];
                    while(q!=-1)
                    {
                        if(H[q].data==ans)
                        {
                            Max+=H[q].num;
                            break;
                        }
                        q=H[q].next;
                    }
                }
            }
            printf("%d
    ",Max);
        }
        return 0;
    }
    

    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    趣学算法:一场说走就走的旅行 (最短路)
    趣学算法:一场说走就走的旅行 (最短路)
    计蒜客:节食的限制(01背包)
    计蒜客:节食的限制(01背包)
    计蒜客:箱子剩余空间(01背包)
    计蒜客:箱子剩余空间(01背包)
    计蒜客:汽车费用(完全背包)
    计蒜客:汽车费用(完全背包)
    计蒜客: 等和的分隔子集 (01背包)
    .Cannot create an NSPersistentStoreCoordinator with a nil model
  • 原文地址:https://www.cnblogs.com/juechen/p/4721920.html
Copyright © 2020-2023  润新知