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 }