二分查找的算法,注意题目要求输出一个数第一次出现的位置。水题,就不多说了。
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <set>
#include <vector>
#include <map>
#include <cmath>
#include <algorithm>
#include <memory.h>
#include <string>
#include <cstring>
#include <sstream>
#include <cstdlib>
#include <ctime>
#include <cassert>
using namespace std;
const int MAXN =10005;
int p[MAXN],N;
int cmp(const int a,const int b)
{
return a<b;
}
int bin_s(int key)
{
int low=1,high=N,mid,ans=-1;
while(low<=high)
{
mid=(low+high)/2;
if(p[mid]<key) low=mid+1;
else if(p[mid]>key) high=mid-1;
else {ans=mid;break;}
}
if(ans!=-1)
while(p[ans]==key) ans--;
return ans+1;
}
int main()
{
int Q,i,key,ans,T=1;
while(scanf("%d%d",&N,&Q)!=EOF&&N&&Q)
{
for (i=1;i<=N;i++)
scanf("%d",&p[i]);
sort(p+1,p+1+N,cmp);
printf("CASE# %d:\n",T);
for(i=1;i<=Q;i++)
{
scanf("%d",&key);
ans=bin_s(key);
if(ans==0) printf("%d not found\n",key);
else printf("%d found at %d\n",key,ans);
}
T++;
}
return 0;
}