题目描述
给你一个序列,然后给你m个元素,让你从序列中找出与每个元素最接近的数字输出来,如果有两个就输出两个。
输入
多组输入,第一行给你两个数n(0 < n < 10000000),m(0 < m < n),接下来是数列的n个数,然后再输入m个元素,让你找出最接近每个元素的值。如果有两个,按从小到大输出。
输出
这m个数分别输出最接近每个元素的值,组与组之间输出一个空行。
示例输入
8 4
1 2 3 4 5 6 8 11
4
9
2
7
示例输出
4
8
2
6 8
<span style="font-size:24px;">#include <stdio.h> #include <stdlib.h> #include <string.h> #include <algorithm> using namespace std; int s[10000010]; int main() { int n=0,k=0,l=0,mid,i=0,flag=0,head=0,tail=0; while(scanf("%d%d",&n,&k)!=EOF) { for(i=0; i<n; i++) { scanf("%d",&s[i]); } sort(s,s+n); for(i=0; i<k; i++) { flag=0; scanf("%d",&l); head=0; tail=n-1; while(head<=tail) //二分搜索 { mid=head+(tail-head)/2; if(s[mid]==l) { printf("%d\n",l); flag=1; break; } if(l<s[mid]) { tail=mid-1; } if(l>s[mid]) { head=mid+1; } } if(flag==0&&l<s[n-1]&&l>s[0])//下面是我一开始被掉进去的坑 { if((l-s[tail])==(s[head]-l)) { printf("%d %d\n",s[tail],s[head]); continue; } else { if((l-s[tail])<(s[head]-l)) { printf("%d\n",s[tail]); } else { printf("%d\n",s[head]); } } } if(flag==0&&l>s[n-1]) { printf("%d\n",s[n-1]); } if(flag==0&&l<s[0]) { printf("%d\n",s[0]); } } printf("\n"); } return 0; } </span>