题目描述:
给定一个长度为n的数字序列a[i],接下来输入m个数b[i],对于每个数字,在a[]中找出两个数字x,y,使得b[i]在区间[ x , y )内,要求这个区间长度尽量小。
分析:
其实题目就是要求在排序后的序列a[]中,找到某个位置k使得 a[k]<=b<a[k+1]。然后输出a[k]和a[k+1]即可。
很明显可以使用二分查找法。
似乎数据很弱…… 用qsort和n^2排序都是0.00秒。但是只有200多的AC人数,实在难以理解……
#include <stdio.h>
#include <stdlib.h>
#define N 1001
int a[N],b;
int cmp(const void *x,const void *y){
return *(int*)x - *(int*)y;
}
int Bsearch(int a[],int n,int b){
int l,r,m;
if(a[n-1]<=b || a[0]>b) return -1;
l=0;r=n-1;
while(l<r-1){
m=(l+r)/2;
if(a[m]<=b) l=m;
else r=m;
}
return l;
}
int main()
{
int i,j,k,m,n;
while(scanf("%d%d",&n,&m)!=EOF){
for(i=0;i<n;i++) scanf("%d",&a[i]);
qsort(a,n,sizeof(int),cmp);
for(i=0;i<m;i++){
scanf("%d",&b);
k=Bsearch(a,n,b);
if(k<0) puts("no such interval");
else printf("[%d,%d)/n",a[k],a[k+1]);
}
puts("");
}
return 0;
}