• 中国海洋大学第四届朗讯杯高级组 I Cuckoo for Hashing


    http://acm.sdut.edu.cn/sdutoj/showproblem.php?pid=2719&cid=1203

    题意 :意思就是哈希来的,具体大意就是说有两个哈希表,然后有这样一组数据,让你把这组数据存到这两个哈希表里,然后不能重复,先让数据往表1里存,就是对表1的长度进行取余,如果余数这个位置没有数就存上,如果有的话,就存上这个数,让原来的数再去表2里存,也是按照这个方式。就是来回踢。。。我觉得。。。。

    思路:两个哈希表,一个循环找即可。。。当时做的时候把自己绕进去了。。。。

    #include <stdio.h>
    #include <string.h>
    #include <map>
    #include <iostream>
    
    using namespace std ;
    int ch[1100];
    int sh[1100];
    int main()
    {
        int n1,n2,k ;
        int t = 1 ;
        while(scanf("%d%d%d",&n1,&n2,&k)!=EOF)
        {
    
            memset(ch,-1,sizeof(ch));
            memset(sh,-1,sizeof(sh)) ;
            if(n1 == 0&&n2==0&&k==0) break;
            int x ;
            for(int i = 1 ; i <= k ; i++)
            {
                scanf("%d",&x);
                while(1)
                {
                    int s=x%n1;
                    if(ch[s] == -1)
                    {
                        ch[s]=x;
                        break;
                    }
                    else
                    {
                        int temp=ch[s];
                        ch[s]=x;
                        int tt=temp%n2;
                        if(sh[tt]==-1)
                        {
                            sh[tt]=temp;
                            break;
                        }
                        else
                        {
                            x=sh[tt];
                            sh[tt]=temp;
                        }
                    }
                }
            }
            printf("Case %d:
    ",t);
            t++;
            int flag = 0 ;
            for(int i = 0 ; i < n1 ; i++)
            {
                if(ch[i] != -1)
                {
                    flag = 1 ;
                    break ;
                }
            }
            if(flag)
            {
                printf("Table 1
    ");
                for(int i = 0 ; i < n1 ; i++)
                {
                    if(ch[i] != -1)
                    {
                        printf("%d:%d
    ",i,ch[i]) ;
                    }
                }
            }
            flag = 0 ;
            for(int i = 0 ; i < n2 ; i++)
            {
                if(sh[i] != -1)
                {
                    flag = 1 ;
                    break ;
                }
            }
            if(flag)
            {
                printf("Table 2
    ");
                for(int i = 0 ; i < n2 ; i++)
                {
                    if(sh[i] != -1)
                    {
                        printf("%d:%d
    ",i,sh[i]) ;
                    }
                }
            }
        }
        return 0 ;
    }
    View Code

    下面这个是用map做的,不厚道,直接用的二货的。

    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<map>
    using namespace std;
    int main()
    {
        int n1,n2,m,c,t=1;
        while(scanf("%d%d%d",&n1,&n2,&m)!=EOF)
        {
            map<int,int>q1;
            map<int,int>q2;
            if(n1==0&&n2==0&&m==0) break;
            for(int i=1; i<=m; i++)
            {
                scanf("%d",&c);
                while(1)
                {
                    int s=c%n1;
                    if(q1.find(s)==q1.end())
                    {
                        q1[s]=c;
                        break;
                    }
                    else
                    {
                        int cc=q1[s];
                        q1[s]=c;
                        int tt=cc%n2;
                        if(q2.find(tt)==q2.end())
                        {
                            q2[tt]=cc;
                            break;
                        }
                        else
                        {
                            c=q2[tt];
                            q2[tt]=cc;
                        }
                    }
                }
            }
            printf("Case %d:
    ",t);
            t++;
            if(!q1.empty())
            {
                printf("Table 1
    ");
                map<int,int>::const_iterator inter=q1.begin();
                while(inter!=q1.end())
                {
                    cout<<inter->first<<':';
                    cout<<inter->second<<endl;
                    inter++;
                }
            }
            if(!q2.empty())
            {
                printf("Table 2
    ");
                map<int,int>::const_iterator inter1=q2.begin();
                while(inter1!=q2.end())
                {
                    cout<<inter1->first<<':';
                    cout<<inter1->second<<endl;
                    inter1++;
                }
            }
        }
        return 0;
    }
    View Code
  • 相关阅读:
    jquery多次上传同一张图片
    选中没有选中的复选框,匹配含有某个字符串的正则,json取值的两种方法,把变量定义在外面跟里面的区别
    点击div全选中再点击取消全选div里面的文字
    this指向问题
    js的querySelector跟querySelectorAll
    点击下箭头⤵️变上箭头⬆️来回切换的两种方法
    a标签的href值
    padding下中英文左右两端对齐
    map()函数
    设计模式
  • 原文地址:https://www.cnblogs.com/luyingfeng/p/3463670.html
Copyright © 2020-2023  润新知