hzu3-History Exam

题目大意:

有一段降序排列的数据A,数目为n,然后有一些数据B,数目为m,这些数据中可能有重复的值,问:B中出现了几个A中有的数据

解题思路:

如果直接采用遍历搜索,那么,最坏情况下,时间复杂度为n*m(1<=n<=15000,1<=M<=10e6),这明显会超时,所以得采用其他的搜索算法,题目中提到,教授给出的数据是已经是排好序的,升序,则这个时候可用二分查找法,对于n,2^15>15000,所以,最坏情况下,每个B中的数据只要匹配大约15次即可知道有无在A中,所以,对于m的顶峰值10e6,最坏遍历情况是在1500万到1600万之间,这个是不会超的。

代码:

#include

#include

usingnamespacestd;

inta[15005],n;

boolfind(intt)//二分查找

{

if(ta[n-1])

{

returnfalse;

}

intleft,right,mid;

left=0;

right=n-1;

while(left<=right)

{

mid=(left+right)/2;

if(t==a[mid])

{

returntrue;

}

elseif(t

{

right=mid-1;

}

else

{

left=mid+1;

}

}

returnfalse;

}

intmain()

{

intm,t,cnt=0;

scanf("%d",&n);

for(inti=0;i

{

scanf("%d",&a[i]);

}

scanf("%d",&m);

for(inti=0;i

{

scanf("%d",&t);

if(find(t))

{

cnt++;

}

}

printf("%d\n",cnt);

return0;

}

你可能感兴趣的:(hzu3-History Exam)