- 总时间限制:
- 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 ",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--)的小技巧罢了。