Problem Description
给你一个序列,然后给你m个元素,让你从序列中找出与每个元素最接近的数字输出来,如果有两个就输出两个。
Input
多组输入,第一行给你两个数n(0 < n < 10000000),m(0 < m < n),接下来是数列的n个数,然后再输入m个元素,让你找出最接近每个元素的值。如果有两个,按从小到大输出。
Output
这m个数分别输出最接近每个元素的值,组与组之间输出一个空行。
Example Input
8 4 1 2 3 4 5 6 8 11 4 9 2 7
Example Output
4 8 2 6 8
Hint
Author
lwn
代码:
#include <stdio.h> #include <stdlib.h> int a[10000010]; void paixu(int n,int m) { int x=a[n]; int i=n,j=m; if(n>=m) return ; //*****不要忘记写 while(i<j) { while(i<j&&a[j]>=x) j--; a[i]=a[j]; while(i<j&&a[i]<=x) i++; a[j]=a[i]; } a[i]=x; paixu(n,i-1); paixu(i+1,m); } void find(int n,int m,int k) { int mid; if(k<a[0]) //把此条件写到while后面,相当于每次进行完while以后再进行条件判断,多余步骤 printf("%d\n",a[0]); else if(k>a[m]) printf("%d\n",a[m]); else { while(n<=m) { mid=(n+m)/2; if(a[mid]==k) { printf("%d\n",k); break; } else if(a[mid]<k) { n=mid+1; if(a[n]>k) { if(a[n]-k>k-a[mid]) { printf("%d\n",a[mid]); break; } else if(a[n]-k<k-a[mid]) { printf("%d\n",a[n]); break; } else { printf("%d %d\n",a[mid],a[n]); break; } } } else if(a[mid]>k) { m=mid-1; if(a[m]<k) { if(a[mid]-k>k-a[m]) { printf("%d\n",a[m]); break; } else if(a[mid]-k<k-a[m]) { printf("%d\n",a[mid]); break; } else { printf("%d %d\n",a[m],a[mid]); break; } } } } } } int main() { int n,m; int i; int k; while(scanf("%d %d",&n,&m)!=EOF) { for(i=0; i<n; i++) scanf("%d",&a[i]); paixu(0,n-1); while(m--) { scanf("%d",&k); find(0,n-1,k); } printf("\n"); } return 0; }