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
51 #include <iostream> 2 #include <cstdio> 3 #include <cmath> 4 using namespace std; 5 int n,m,i,l,r,mid,before,x; 6 bool bb; 7 int a[100100]; 8 int main() 9 { 10 scanf("%d",&n); 11 for (i=1;i<=n;i++) 12 scanf("%d",&a[i]); 13 scanf("%d",&m); 14 for (i=1;i<=m;i++) 15 { 16 scanf("%d",&x); 17 l=1; r=n; bb=0; 18 while (l<r) 19 { 20 mid=(l+r)/2; 21 if (a[mid]<=x) 22 l=mid; 23 else 24 r=mid; 25 if (l+1==r) 26 if (abs(x-a[l])<=abs(x-a[r])) 27 { 28 printf("%d ",a[l]); 29 bb=1; 30 break; 31 } 32 else 33 { 34 printf("%d ",a[r]); 35 bb=1; 36 break; 37 } 38 } 39 if (!bb) 40 printf("%d ",a[l]); 41 } 42 return 0; 43 }