题目链接:http://acm.tju.edu.cn/toj/showp3843.html
题目大意:求两个set的交集
思路:一开始写了个,超时了;然后才想到后面数组过大:160000,才想到二分查找 二分查找(要查找的值,左边界,右边界),查找之前别忘了对将被二分数组进行排序。
代码:
二分查找代码:
#include <iostream>
#include <algorithm>
using namespace std;
int m,i;
int n,num,j,a[4001],b[160001];
void find(int x,int left,int right) //二分查找 参数:值 左边界 右边界
{
int mid = (left+right)/2;
if(x==b[mid]) num++;
else if(left!=right) //条件别忘了!!!
{
if(x<b[mid])
find(x,left,mid);
if(x>b[mid])
find(x,mid+1,right);
}
}
int main()
{
while(cin>>m>>n)
{
for(i=0;i<m;i++)
cin>>a[i];
for(j=0;j<n;j++)
cin>>b[j];
sort(b,b+n); //二分查找前别忘了先排序 必然是分多的那个哈
num = 0;
for(i=0;i<m;i++)
find(a[i],0,n-1);
cout<<num<<endl;
}
return 0;
}
超时代码:
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
int m,n,i,j;
int a[40001],b[160001],flag[160001];
while(cin>>m>>n)
{
memset(flag,0,sizeof(flag));
for(i=0;i<m;i++)
cin>>a[i];
for(i=0;i<n;i++)
cin>>b[i];
int num = 0;
for(i=0;i<m;i++)
for(j=0;j<n;j++)
{
if(a[i]==b[j]&&!flag[j])
{
num++;
flag[j]=1;
break;
}
}
cout<<num<<endl;
}
return 0;
}