//*****************************************************************************************
//*给定一个升序的整形数组A以及两个整数x和k,要求输出数组A与x之差的绝对值最小的k个元素。若在与x差值的绝对值相等的两个元素,则取其中较小的元素
//*输入描述:输入的第一行为空格分隔的整形数组;第二行为空格分隔的两个整数x和k,数组长度不超过1000,数组元素绝对值和不超过1000,k大于0且不超过数组长度
//*输出描述:每组输入数据对应一行输出,输出数字间以空格分隔
//*实例:1 2 3 4 5
// 3 4
//*输出:2 1 0 1
//
//*****************************************************************************************
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#pragma warning(disable:4996)
void main()
{
int a[1000],i,A,k,buff,max=0;
//int *minv,*minl;
for(i=0 ;;i++)
{
scanf("%d",a+i);
//printf("%d", getchar());
if (getchar() == 10)
{
break;
}
}
scanf("%d",&A);
scanf("%d",&k);
int minl[1000];// = (int*)malloc(k * sizeof(int));
int minv[1000]; //= (int*)malloc(k * sizeof(int));
minl[0] = 0;
minv[0] = abs(a[0] - A);
int j;
for (j = 1; j < k; j++)
{
minl[j] = j;
minv[j] = abs(a[j] - A);
if (minv[j] > minv[max])
{
max = j;
}
}
for (int j = k; j < i; j++)
{
buff = abs(a[j]-A);
if (buff == minv[max])
{
if (a[minl[max]] > a[j])
{
minl[max] = j;
minv[max] = buff;
}
}
else if (buff < minv[max])
{
minv[max] = buff;
minl[max] = j;
}
for (int l = 0; l < k; l++)
{
if (minv[l] > minv[max])
{
max = l;
}
}
}
for (int i = 0; i < k; i++)
{
//int a = minl[i];
printf("%d ", a[minl[i]]);
}
getchar();
getchar();
}