题目

题意: 给定序列要求用二次探测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;
}