题目
![]()
解法1
点击查看代码
#include<iostream>
#include<vector>
#include<unordered_map>
using namespace std;
bool isPrime(int n){
if(n < 2) return false;
if(n==2) return true;
if(n%2==0) return false;
for(int i =3;i*i<n;i+=2){
if(n%i==0) return false;
}
return true;
}
int getNextPrime(int n){
while(!isPrime(n)) n++;
return n;
}
int main(){
int size,n,m; scanf("%d %d %d",&size,&n,&m);
// 建表
size = getNextPrime(size);
vector<int> hashTable(size,-1);
// 插入阶段
for (int i = 0; i < n; ++i) {
int num; scanf("%d", &num);
bool inserted = false;
for (int j = 0; j < size; ++j) {
int idx = (num % size + j * j) % size;
if (hashTable[idx] == -1) {
hashTable[idx] = num;
inserted = true;
break;
}
}
if (!inserted) printf("%d cannot be inserted.\n", num);
}
// 查找阶段
double totalSearchTime = 0;
int query;
for (int i = 0; i < m; ++i) {
scanf("%d", &query);
int cnt = 1;
for (int j = 0; j < size; ++j) {
int idx = (query % size + j * j) % size;
if (hashTable[idx] == query || hashTable[idx] == -1) break;
cnt++;
}
totalSearchTime += cnt;
}
printf("%.1f\n", totalSearchTime / m);
return 0;
}