zoukankan      html  css  js  c++  java
  • Hash

    按照yyhdalao的话来说那就是看到什么学什么不用照着学,能学什么学什么。

    所以今天领悟了一下hash(自己打的并不是很规范的吧,我感觉

    找到A集合与B集合的关系由于集合中的数字过大所以要进行hash一下。

    首先尝试定义一个mod然后开始%,这样使较大的数字存到桶里进行调用。但是数字过大可能两个数字同时%掉这个数字的话就可能一样的了。

    这就是70分的原因,还有就是这道题没多少细节,水水就过去了。开始考虑怎么水过......

    map吧直接两个数字开始绑定,然后进行比较,好方法!于是水过了这道题。。

    #include<iostream>
    #include<string>
    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<algorithm>
    #include<iomanip>
    #include<ctime>
    #include<vector>
    #include<queue>
    #include<map>
    #include<stack>
    using namespace std;
    inline int read()
    {
        int x=0,f=1;char ch=getchar();
        while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
        while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
        return x*f;
    }
    const int maxn=10000017;
    int n,m,x;
    int num=0,top=0;
    map<int,int>a;
    map<int,int>b;
    int c[maxn],d[maxn];
    int main()
    {
        n=read();for(int i=1;i<=n;i++)x=read(),a[x]=1,c[i]=x;
        m=read();for(int j=1;j<=m;j++)x=read(),b[x]=1,d[j]=x;
        if(n>m)
        {
            int flag=0,u=0;
            for(int i=1;i<=m;i++)
            {
                if(a[d[i]]!=1)flag=1;
                if(a[d[i]]==1)u=1;
            }
            if(flag==0)printf("B is a proper subset of A
    ");
            if(flag==1&&u==1)printf("I'm confused!");
            if(flag==1&&u==0)printf("A and B are disjoint");
        }
        if(n<m)
        {
            int flag=0,u=0;
            for(int i=1;i<=n;i++)
            {
                if(b[c[i]]!=1)flag=1;
                if(b[c[i]]==1)u=1;
            }
            if(flag==0)printf("A is a proper subset of B
    ");
            if(flag==1&&u==1)printf("I'm confused!");
            if(flag==1&&u==0)printf("A and B are disjoint");
        }
        if(n==m)
        {
            int flag=0,u=0;
            for(int i=1;i<=n;i++)
            {
                if(a[d[i]]!=1)flag=1;
                if(a[d[i]]==1)u=1;
            }
            if(flag==0)printf("A equals B
    ");
            if(flag==1&&u==1)printf("I'm confused!");
            if(flag==1&&u==0)printf("A and B are disjoint");
        }
        return 0;
    }

    可是时间虽然不超但是速度实在是太慢了,这个算法不优秀(尽管map足够优秀了

    然后继续hash啊,拉链法搞一波,其实就是开一个邻接表即可。。。简单

    #include<iostream>
    #include<string>
    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<algorithm>
    #include<iomanip>
    #include<ctime>
    #include<vector>
    #include<queue>
    #include<map>
    #include<stack>
    using namespace std;
    inline int read()
    {
        int x=0,f=1;char ch=getchar();
        while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
        while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
        return x*f;
    }
    const int maxn=10000017;
    int n,m,x;
    int num=0,top=0;
    map<int,int>a;
    map<int,int>b;
    int c[maxn],d[maxn];
    int main()
    {
        n=read();for(int i=1;i<=n;i++)x=read(),a[x]=1,c[i]=x;
        m=read();for(int j=1;j<=m;j++)x=read(),b[x]=1,d[j]=x;
        if(n>m)
        {
            int flag=0,u=0;
            for(int i=1;i<=m;i++)
            {
                if(a[d[i]]!=1)flag=1;
                if(a[d[i]]==1)u=1;
            }
            if(flag==0)printf("B is a proper subset of A
    ");
            if(flag==1&&u==1)printf("I'm confused!");
            if(flag==1&&u==0)printf("A and B are disjoint");
        }
        if(n<m)
        {
            int flag=0,u=0;
            for(int i=1;i<=n;i++)
            {
                if(b[c[i]]!=1)flag=1;
                if(b[c[i]]==1)u=1;
            }
            if(flag==0)printf("A is a proper subset of B
    ");
            if(flag==1&&u==1)printf("I'm confused!");
            if(flag==1&&u==0)printf("A and B are disjoint");
        }
        if(n==m)
        {
            int flag=0,u=0;
            for(int i=1;i<=n;i++)
            {
                if(a[d[i]]!=1)flag=1;
                if(a[d[i]]==1)u=1;
            }
            if(flag==0)printf("A equals B
    ");
            if(flag==1&&u==1)printf("I'm confused!");
            if(flag==1&&u==0)printf("A and B are disjoint");
        }
        return 0;
    }

    Perfectly AC!

    想喝水时,仿佛能喝下整个海洋似的——这是信仰;等到真的喝起来,一共也只能喝两杯罢了——这是科学。

                                                     ————  契柯夫

  • 相关阅读:
    使用基于Apache Spark的随机森林方法预测贷款风险
    信用评分怎么算出来的?偷偷给你一份客户信用等级简易评估模型.......
    高收益债券信用风险评估:预期损失率模型
    评分模型的检验方法和标准通常有:K-S指标、交换曲线、AR值、Gini数等。例如,K-S指标是用来衡量验证结果是否优于期望值,具体标准为:如果K-S大于40%,模型具有较好的预测功能,发展的模型具有成功的应用价值。K-S值越大,表示评分模型能够将“好客户”、“坏客户”区分开来的程度越大。
    信用评分卡模型入门(智能算法)
    BufferingForwardingAppender in log4net
    lockingModel in log4net 日志文件不能被其他进程写入
    rollingstyle in log4net
    sql server update时,是行锁还是表锁
    multi update caused deadlock problem
  • 原文地址:https://www.cnblogs.com/chdy/p/9989794.html
Copyright © 2011-2022 走看看