Description
给你一个序列,然后给你m个元素,让你从序列中找出与每个元素最接近的数字输出来,如果有两个就输出两个。
Input
多组输入,第一行给你两个数n(0 < n < 10000000),m(0 < m < n),接下来是数列的n个数,然后再输入m个元素,让你找出最接近每个元素的值。如果有两个,按从小到大输出。
Output
这m个数分别输出最接近每个元素的值,组与组之间输出一个空行。
Sample Input
8 4 1 2 3 4 5 6 8 11 4 9 2 7
Sample Output
4 8 2 6 8
模板题
代码如下:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <algorithm>
using namespace std;
int a[10000010];
int search1(int k,int m)
{
int mid,left=0,right=m-1,p=0;
while(left<=right)
{
mid = (left+right)/2;
if(a[mid]<=k)
{
left=mid+1;
p=a[mid];
}
else
{
right=mid-1;
}
}
return p;
}
int search2(int k,int m)
{
int mid,left=0,right=m-1,p=0;
while(left<=right)
{
mid = (left+right)/2;
if(a[mid]<k)
{
left=mid+1;
}
else
{
right=mid-1;
p=a[mid];
}
}
return p;
}
int search3(int k,int m)
{
int mid,left=0,right=m-1,p=0;
while(left<=right)
{
mid = (left+right)/2;
if(a[mid]<k)
{
left=mid+1;
}
else if(a[mid]>k)
{
right=mid-1;
}
else
{
p=a[mid];
break;
}
}
return p;
}
int main()
{
int n,i,k,m;
while(~scanf("%d%d",&m,&n))
{
memset(a,0,sizeof(a[0]));
for(i=0; i<m; i++)
{
scanf("%d",&a[i]);
}
sort(a,a+m);
for(i=0; i<n; i++)
{
scanf("%d",&k);
if(k<=a[0])
printf("%d\n",a[0]);
else if(search3(k,m)==k)
printf("%d\n",k);
else if(abs(k-search1(k,m))>abs(k-search2(k,m)))
printf("%d\n",search2(k,m));
else if(abs(k-search1(k,m))<abs(k-search2(k,m)))
printf("%d\n",search1(k,m));
else if(abs(k-search1(k,m))==abs(k-search2(k,m)))
printf("%d %d\n",search1(k,m),search2(k,m));
}
printf("\n");
}
return 0;
}