题目


解法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;
}