Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^
题目描述
给你一个序列,然后给你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
#include<stdio.h>
#include<algorithm>
using namespace std;
int cmp(int x,int y)
{
return x<y;
}
int main()
{
int n,m,a[10001],x,y,b[10001],count,d;
while(scanf("%d%d",&n,&m)!=EOF)
{
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
sort(a,a+n,cmp);
/*for(int i=0;i<n-1;i++)
for(int j=i+1;j<n;j++)
if(a[i]>a[j])
{
d=a[i];a[i]=a[j];a[j]=d;
}*/
for(int i=0;i<m;i++)
{ scanf("%d",&b[i]);
//for(int i=0;i<m;i++)
x=0,y=n-1;count=0;
while(x<=y)
{
if(b[i]>=a[n-1]){printf("%d\n",a[n-1]);break;}
else if(b[i]<=a[0]){printf("%d\n",a[0]);break;}
else
{
count=x+(y-x)/2;
if(a[count]==b[i]) {printf("%d\n",a[count]);break;}
else if(a[count+1]>b[i]&&b[i]>a[count])
{ if(a[count+1]-b[i]==b[i]-a[count])
printf("%d %d\n",a[count],a[count+1]);
else if(a[count+1]-b[i]>b[i]-a[count])
printf("%d\n",a[count]);
else if(a[count+1]-b[i]<b[i]-a[count])
printf("%d\n",a[count+1]);
break;
}
else if(a[count]>b[i]) y=count;
else x=count+1;
}
}
}
printf("\n");
}
return 0;
}