首页 > 试题广场 >

数轴

[编程题]数轴
  • 热度指数:9 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 64M,其他语言128M
  • 算法知识视频讲解
牛牛非常喜欢和朋友们一起玩。
牛牛有n个朋友当前在一根数轴上,每个朋友当前在整数x[i]坐标位置。
牛牛向他们发出一个移动的信号,每个朋友就向左或者向右移动s距离(每个朋友的选择是独立的,都可以选择向左或者向右)。
为了在一起玩耍方便,牛牛希望移动之后最左边的朋友和最右边的朋友距离最近,牛牛想知道最近距离为多少。

例如牛牛有三个朋友分别所在数轴坐标为-7, 4, 7, s = 5
那么第一个朋友-7向右移动s,变为-2
第二个朋友4向左移动s,变为-1
第三个朋友7向左移动s,变为2。
现在最左和最右的朋友距离是4,没有比这个更优的方案了。

输入描述:
输入包括两行,第一行两个正整数n和s(2 ≤ n ≤ 50, 0 ≤ s ≤ 10^8),表示朋友的个数和移动的距离。
第二行包括n个正整数x[i](-10^8 ≤ x[i] ≤ 10^8),表示初始时每个朋友所在的坐标位置。


输出描述:
输出一个正整数,表示移动之后最左边的朋友和最右边的朋友最小距离为多少。
示例1

输入

3 5
4 -7 7

输出

4
讲这些人的位置排序以后,分成辆部分,左部分右移,右部分左移,去一个个遍历所有的划分,左右部分最右边的点分别移动以后,只有他们两个可能产生所有人中最右边的点,同理可以找到最左边的点
import java.util.*;

public class Main 
{
    public static void main(String[] args) 
    {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int s = scanner.nextInt();
        int[] pos = new int[n];
        for (int i = 0; i < n; i++)
            pos[i] = scanner.nextInt();
        Arrays.sort(pos);
        int answer = pos[n - 1] - pos[0];
        for (int i = 0; i < n - 1; i++)
        {
            int right = Math.max(pos[i] + s, pos[n - 1] - s);
            int left = Math.min(pos[0] + s, pos[i + 1] - s);
            answer = Math.min(answer, Math.abs(right - left));
        }
        System.out.println(answer);
    }
}


发表于 2026-05-24 09:46:40 回复(0)