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;
}

1266

被折叠的 条评论
为什么被折叠?



