Openjudge1.11.1 查找最接近的元素

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

【输入】
    第一行包含一个整数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 }
原文地址:https://www.cnblogs.com/TheZealous/p/14529616.html