http://noi.openjudge.cn/ch0111/01/

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 #include<math.h>
 4 int fun(int a[],int n,int t)
 5 {
 6     int L,R,mid;
 7     int x,y;
 8     L=0;R=n-1;
 9     while(L<=R)
10     {
11         mid=L+(R-L)/2;
12         if(a[mid]==t) return a[mid];
13         else if(a[mid]<t) L=mid+1;
14         else R=mid-1;
15     }
16     x=abs(a[L]-t);
17     y=abs(a[R]-t);
18     if(x<y) return a[L];
19     else if(x>y) return a[R];
20     else return (a[L]<a[R]?a[L]:a[R]);
21 }
22 int main(int argc, char *argv[])
23 {
24     int n,a[100003],m,t,i,res;
25     scanf("%d",&n);
26     for(i=0;i<n;i++) scanf("%d",&a[i]);
27     scanf("%d",&m);
28     for(i=0;i<m;i++)
29     {
30         scanf("%d",&t);
31         
32         if(t<a[0]) res=a[0];
33         else if(t>a[n-1]) res=a[n-1];
34         else res=fun(a,n,t);
35         
36         printf("%d\n",res);
37     }
38     return 0;
39 }
View Code

相关文章:

  • 2021-10-15
  • 2022-02-14
  • 2021-12-06
  • 2021-05-26
猜你喜欢
  • 2022-12-23
  • 2022-12-23
  • 2021-05-28
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案