题意: 给定序列要求用二次探测hash法插入序列,无法插入则输出 X cannot be inserted., 最后输出平均查找时间
#include<iostream>
using namespace std;
int prime[100003]= {0};
void isprime() {
prime[0]=1;
prime[1]=1;
for(int i=2; i<100003; ++i)
if(!prime[i])
for(int j=i+i; j<100003; j+=i)
prime[j]=1;
}
int main() {
int n,m,k;
isprime();
cin>>n>>m>>k;
while(prime[n])
n++;
int ans[n]= {0};
for(int i=0; i<m; ++i) {
int a,flag=0;
cin>>a;
for(int j=0; j<n; ++j)
if(ans[(a+j*j)%n]==0) {//二次探测
flag=1;
ans[(a+j*j)%n]=a;
break;
}
if(!flag)
cout<<a<<" "<<"cannot be inserted.\n";
}
int count=0;
for(int i=0; i<k; ++i) {
int a;
cin>>a;
for(int j=0; j<=n; ++j) {
count++;
if(ans[(a+j*j)%n]==a||!ans[(a+j*j)%n])//找到或者不存在
break;
}
}
printf("%.1lf\n",count*1./k);
return 0;
}