您的位置:首页 > 其它

ZJU2029 The Intervals - 二分查找

2008-02-12 21:46 162 查看
题目描述:

给定一个长度为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
,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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: