【描述】
在一个非降序列中,查找与给定值最接近的元素。
【输入】
第一行包含一个整数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 <bits/stdc++.h> 2 using namespace std; 3 int n; 4 long a[100001]; 5 long m; 6 long k; 7 void binarysearch(long long w) 8 { 9 int left=1; 10 int right=n,mid; 11 while(right>left+1) 12 { 13 mid=left+(right-left)/2;//第一遍写成left-right了 14 if(a[mid]<w) 15 { 16 left=mid; 17 }else 18 { 19 right=mid; 20 } 21 } 22 if(abs(a[left]-w)<=abs(a[left+1]-w)){ 23 cout<<a[left]<<endl; 24 }else{ 25 cout<<a[left+1]<<endl; 26 } 27 } 28 int main() 29 { 30 long m; 31 long k; 32 scanf("%d",&n); 33 for(int i=1;i<=n;i++) 34 { 35 scanf("%d",&a[i]); 36 } 37 scanf("%d",&m); 38 for(int i=1;i<=m;i++) 39 { 40 scanf("%d",&k); 41 if(n==1){ 42 printf("%d ",a[1]);//这里记得换行,不然会Presentation Error 43 }else{ 44 binarysearch(k); 45 } 46 47 } 48 49 return 0; 50 }