• 好元素【哈希】


    题目大意:

    给出一个数列,求有多少个数字满足以下两个条件。

    {1i,j,k<la[l]=a[i]+a[j]+a[k]


    思路:

    这道题n5000O(n3)过不了。
    于是考虑移项,讲a[k]移到等号左边,就成了

    a[l]a[k]=a[i]+a[j]

    那么用哈希储存等号右边答案,再用等号左边去匹配,记录符合要求的数字个数即可。
    时间复杂度:O(n2)


    代码:

    #include <cstdio>
    #include <algorithm>
    using namespace std;
    
    const int hash=25000004;
    const int csh=689207157;
    int n,a[10011],d[10011],m,sum,ha[hash];
    bool ok;
    
    int locate(int x)  //哈希
    {
        int t=(x%hash+hash)%hash;
        int i=0;
        while (i<hash&&ha[(t+i)%hash]!=x&&ha[(t+i)%hash]!=csh) i++;
        return (t+i)%hash;
    }
    
    void inserts(int x)  //插入元素至哈希表
    {
        int y=locate(x);
        ha[y]=x;
        return;
    }
    
    bool find(int x)  //在哈希表中查找元素
    {
        return ha[locate(x)]==x;
    }
    
    int main()
    {
        freopen("good.in","r",stdin);
        freopen("good.out","w",stdout);
        scanf("%d",&n); 
        for (int i=0;i<hash;i++) ha[i]=csh;
        for (int i=1;i<=n;i++)
        {
            scanf("%d",&a[i]);
            ok=false;
            for (int j=1;j<i;j++)  //匹配
            {
                if (find(a[i]-a[j])&&!ok)  //存在这个数字且没有被匹配过
                {
                    sum++;  //答案加一
                    ok=true;
                    break;
                }   
            }
            for (int j=1;j<=i;j++) inserts(a[i]+a[j]);  //插入
        }
        printf("%d\n",sum);
    }
  • 相关阅读:
    flask和tornado的区别
    tornado1
    人脸识别
    ocr:img转成pdf,pdf转成pdf
    flask2
    《个人-GIT使用方法》
    课后作业-阅读任务-阅读笔记
    课后作业-阅读任务-阅读提问
    结对-四则运算生成器-设计文档
    团队-手机备忘录-开发环境搭建过程
  • 原文地址:https://www.cnblogs.com/hello-tomorrow/p/11998856.html
Copyright © 2020-2023  润新知