Openjudge NOI题库 ch0111/01 查找最近的元素

总时间限制:
1000ms
内存限制:
65536kB
描述

在一个非降序列中,查找与给定值最接近的元素。

输入
第一行包含一个整数n,为非降序列长度。1 <= n <= 100000。
第二行包含n个整数,为非降序列各元素。所有元素的大小均在0-1,000,000,000之间。
第三行包含一个整数m,为要询问的给定值个数。1 <= m <= 10000。
接下来m行,每行一个整数,为要询问最接近元素的给定值。所有给定值的大小均在0-1,000,000,000之间。
输出
m行,每行一个整数,为最接近相应给定值的元素值,保持输入顺序。若有多个值满足条件,输出最小的一个。
样例输入
3
2 5 8
2
10
5
样例输出
8
5

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #define maxn 100010
 4 int a[maxn];
 5 int n;
 6 int cmp(const void *a,const void *b)
 7 {
 8     return *(int *)a-*(int *)b;
 9 }
10 void search(int x)
11 {
12     int mid,l,r,ans=-1;
13     mid=n/2;
14     l=0;
15     r=n;
16     while(l<r-1)
17     {
18         if(a[mid]>x) r=mid;
19         else l=mid;
20         mid=(r+l)/2;
21     }
22     if(l+1==n||x-a[l]<=a[l+1]-x) ans=a[l];
23     else ans=a[l+1];
24     printf("%d\n",ans);
25 }
26 int main()
27 {
28     int m,f;
29     int i;
30     scanf("%d",&n);
31     for(i=0;i<n;i++)
32         scanf("%d",&a[i]);
33     qsort(a,n,sizeof(int),cmp);
34     scanf("%d",&m);
35     while(m--)
36     {
37         scanf("%d",&f);
38         search(f);
39     }
40     return 0;
41 }

作为一道最基础的二分题,好像也没什么好讲的,也就是while(m--)的小技巧罢了。

你可能感兴趣的:(Openjudge NOI题库 ch0111/01 查找最近的元素)