zoukankan      html  css  js  c++  java
  • 【PAT甲级】1078 Hashing (25 分)(哈希表二次探测法)

    题意:

    输入两个正整数M和N(M<=10000,N<=M)表示哈希表的最大长度和插入的元素个数。如果M不是一个素数,把它变成大于M的最小素数,接着输入N个元素,输出它们在哈希表中的位置(从0开始),如有冲突采取二次探测法处理冲突。

    trick:

    测试点1包含M为1的数据,1不是素数。。。

    AAAAAccepted code:

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 int a[10007];
     4 int ans[10007];
     5 int vis[100007];
     6 int main(){
     7     ios::sync_with_stdio(false);
     8     cin.tie(NULL);
     9     cout.tie(NULL);
    10     int m,n;
    11     cin>>m>>n;
    12     int flag=0;
    13     for(int i=2;i*i<=m;++i)
    14         if(m%i==0){
    15             flag=1;
    16             break;
    17         }
    18     if(flag||m==1)
    19         for(int i=m+1;;++i){
    20             int flag2=0;
    21             for(int j=2;j*j<=i;++j)
    22                 if(i%j==0){
    23                     flag2=1;
    24                     break;
    25                 }
    26             if(!flag2){
    27                 m=i;
    28                 break;
    29             }
    30         }
    31     for(int i=1;i<=n;++i)
    32         cin>>a[i];
    33     for(int i=1;i<=n;++i){
    34         int tamp=a[i]%m;
    35         if(!vis[tamp]){
    36             vis[tamp]=1;
    37             ans[i]=tamp;
    38         }
    39         else{
    40             int flag3=0;
    41             for(int j=1;j<n;++j)
    42                 if(!vis[(tamp+j*j)%m]){
    43                     vis[(tamp+j*j)%m]=1;
    44                     ans[i]=(tamp+j*j)%m;
    45                     flag3=1;
    46                     break;
    47                 }
    48             if(!flag3)
    49                 ans[i]=-1;
    50         }
    51     }
    52     for(int i=1;i<=n;++i){
    53         if(ans[i]==-1)
    54             cout<<"-";
    55         else
    56             cout<<ans[i];
    57         if(i<n)
    58             cout<<" ";
    59     } 
    60     return 0;
    61 } 
    保持热爱 不懈努力 不试试看怎么知道会失败呢(划掉) 世上无难事 只要肯放弃(划掉)
  • 相关阅读:
    luogu P1955 [NOI2015]程序自动分析
    luogu P5514 [MtOI2019]永夜的报应
    bzoj1816[Cqoi2010]扑克牌
    bzoj1040[ZJOI2008]骑士
    bzoj4582[Usaco2016 Open]Diamond Collector
    bzoj1029[JSOI2007]建筑抢修
    bzoj1079[SCOI2008]着色方案
    bzoj1051[HAOI2006]受欢迎的牛
    bzoj4525[Usaco2016 Jan]Angry Cows
    bzoj4512[Usaco2016 Jan] Build Gates
  • 原文地址:https://www.cnblogs.com/ldudxy/p/11820671.html
Copyright © 2011-2022 走看看