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 int main(int argc, char *argv[]) 4 { 5 int n,i,*a,m,t; 6 int begin,end,mid; 7 int x,y; 8 9 scanf("%d",&n); 10 a=(int *)malloc(n*sizeof(int)); 11 for(i=0;i<n;i++) scanf("%d",&a[i]); 12 13 scanf("%d",&m); 14 for(i=0;i<m;i++) 15 { 16 scanf("%d",&t); 17 if(a[0]>t) { printf("%d\n",a[0]); continue;} 18 else if(a[n-1]<t) { printf("%d\n",a[n-1]); continue;} 19 20 begin=0; 21 end=n-1; 22 mid=(begin+end)/2; 23 while(begin<=end) //while(end-begin>1) 24 { 25 if(a[mid]==t) { printf("%d\n",a[mid]);break;} 26 else 27 { 28 if(a[mid]>t) 29 { 30 end=mid-1; 31 } 32 else 33 { 34 begin=mid+1; 35 } 36 } 37 mid=(begin+end)/2; 38 } 39 if(a[mid]!=t) 40 { 41 x=abs(a[begin]-t); 42 y=abs(a[end]-t); 43 if(x<y) printf("%d\n",a[begin]); 44 else if(x>y) printf("%d\n",a[end]); 45 else printf("%d\n",(a[begin]<a[end]?a[begin]:a[end])); 46 } 47 } 48 free(a); 49 return 0; 50 }