版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lzyws739307453/article/details/85257841
题目链接:http://120.78.162.102/problem.php?id=6251
时间限制: 1 Sec 内存限制: 128 MB
题目描述
有一天,地球受到了降维打击,从三维变成了一维。从此我们都生活在一条线上,给这条线加上坐标,每个点都是大于等于 0 的正整数。
有一天小明突发奇想,想知道谁是他最亲密的人,距离小明越近的人和小明越亲密。
假设有 N 个人,每个人的编号为 i(1 <= i <= N ),坐标为 ki(k[i-1] <= k[i] <= k[i+1]),小明的坐标为 M(小明是 N 个人中的一个),你们可以帮助小明找到他最亲密的 X个人的编号吗?
输入
多组输入
对于每组数据,第一行为三个整数N(0<N<=100000 )、M(0<M<=100000000)、X(X <= N && X <= 100)
第二行有N个数,分别表示 N 个人的坐标
输出
小明最亲密的 X 个人的编号(亲密度相同的,按id从小到大输出。如果第 x+1 个人和第 x 个人一样亲密,也需要输出)
样例输入
3 2 1
1 2 4
3 2 1
1 2 3
样例输出
1
1
3
解题思路
类似于两个有序数组的合并。我们可以先定义两个变量,一个向前找,一个向后找。然后比较一下,哪个离m比较近,哪个的编号就存进数组,当两个数离m一样近的时候,编号都存进数组。
#include <stdio.h>
#define N 100010
int a[N], s[N];
int main()
{
int n, m, x, k, i, j;
while (~scanf("%d%d%d", &n, &m, &x))
{
for (i = 0; i < n; i++)
{
scanf("%d", &a[i]);
if (a[i] == m)
k = i;
}
i = k - 1;
j = k + 1;
k = 0;
while (i >= 0 && j < n && k < x)
{
if (m - a[i] < a[j] - m)
s[k++] = i--;
else if (m - a[i] > a[j] - m)
s[k++] = j++;
else
{
s[k++] = i--;
s[k++] = j++;
}
}
while (i >= 0 && k < x)
s[k++] = i--;
while (j < n && k < x)
s[k++] = j++;
for (i = 0; i < k; i++)
printf("%d\n", s[i] + 1);
}
return 0;
}