就是找一个数字n在前面给的m个数中是第几大的。
如果有一样的话,取第一次出现的。
数据量很小,直接排序,然后二分查找即可。
不过如果是10^7的数据量,则不能直接排序然后查找。
手写快速排序查看划分区域和要查找的数的大小,然后只进行一边的递归即可。(这题不用这样)
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int MAXN=1e4+10;
int a[MAXN];
int N,Q;
int search(int n){
int head=0,tail=N-1,middle=N/2;
if(n>a[tail] || n<a[head]) return -1;
for(;;){
if(n>a[middle] && n<=a[tail]) {head=middle; middle=(head+tail)/2;}
else if(n<=a[middle] && n>=a[head]) {tail=middle; middle=(head+tail)/2;}
if(middle==head) break;
}
if(n==a[head]) return head;
else if(n==a[tail]) return tail;
else return -1;
}
int main(){
//freopen("in.txt","r",stdin);
int cnt=0;
while(~scanf("%d%d",&N,&Q)){
if(N==0 && Q==0) break;
for(int i=0;i<N;i++) scanf("%d",&a[i]);
sort(a,a+N);
int temp,ans;
cnt++;
printf("CASE# %d:\n",cnt);
for(int i=0;i<Q;i++){
scanf("%d",&temp);
ans=search(temp);
if(ans!=-1) printf("%d found at %d\n",temp,ans+1);
else printf("%d not found\n",temp);
}
}
return 0;
}