ZJU2029 The Intervals - 二分查找

题目描述:

给定一个长度为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;
}

你可能感兴趣的:(ZJU2029 The Intervals - 二分查找)