PAT_A1145
PAT甲级1145.
目录
A1145
题目
样例
输入:
4 5 4
10 6 4 15 11
11 4 15 2
输出:
15 cannot be inserted.
2.8
思路和坑点
思路:
首先,要进行哈希表的构建,哈希的长度为不小于tsize的一个素数。构建哈希表的时候,使用正的平方探测法解决冲突问题。
然后,根据构建好的哈希表进行查找,查找结束的标志为,查找到或者查找到空位、或者回到原位。
AC代码
#include<bits/stdc++.h>
using namespace std;
bool isprime(int n){ //判断是不是素数
for(int i=2;i*i<=n;i++)
if(n%i==0) return false;
return true;
}
int main(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt", "r", stdin);
#endif
int tsize,n,m,a;
scanf("%d%d%d",&tsize,&n,&m);
while(!isprime(tsize)) tsize++; //找到不小于tsize的素数作为哈希表的长度
vector<int> v(tsize,0); //全部初始化为0 ,表示为空位(因为插入的数字都是正数),哈希表
for(int i=0;i<n;i++){
scanf("%d",&a); //读入一个数字
int flag=0; //标记是否放入,1为放入,0为未放入
for(int j=0;j<tsize;j++){ //j为0时表示第一次散列,之后表示二次探测
int pos=(a+j*j)%tsize;
if(v[pos]==0){ //如果找到空位,则插入a并修改标记
v[pos]=a;
flag=1;
break;
}
}
if(flag==0) printf("%d cannot be inserted.\n",a); //输出不能插入的数字
}
int ans=0;
for(int i=0;i<m;i++){
scanf("%d",&a);
for(int j=0;j<=tsize;j++){
ans++; //比较次数加一
int pos=(a+j*j)%tsize;
if(v[pos]==a||v[pos]==0) break;//找到或到达空位,或者j增量取到tsize时回到第一次散列的位置时,结束查找
}
}
printf("%.1lf\n",ans*1.0/m); //输出平均查找次数
return 0;
}