トップページに戻る    次の競技プログラミングの問題へ    前の競技プログラミングの問題へ

No.135 とりあえず1次元の問題

■■■問題■■■

数直線上の整数座標上にN個の点がある。

その中から同じ座標ではない2点を選んで、その2点の距離を求める。
距離は、i番目の点の座標をXi、j番目の点の座標をXjとすると、
絶対値 |Xi - Xj |とする。

この時、最小の距離となる2点を選ぶとして、選んだ2点間の最小距離を求めてください。
条件にあう2点を選べなかったら0を出力してください。

■■■入力■■■

N
X1 X2 ・・・ XN

入力は全て整数で与えられる。
1 <=  N <= 10の5乗
0 <= Xi <= 10の6乗, 1 <= i <= N

■■■出力■■■

条件にあう2点間の最小距離を求めてください。
2点を選べなかったら0を出力してください。

最後に改行してください。


C#のソース

using System;
using System.Collections.Generic;
using System.Linq;

class Program
{
    static string InputPattern = "Input1";

    static List<string> GetInputList()
    {
        var WillReturn = new List<string>();

        if (InputPattern == "Input1") {
            WillReturn.Add("3");
            WillReturn.Add("0 51 100");
            //49
            //51と100の座標の点を選んだら、最小の距離49になります
        }
        else if (InputPattern == "Input2") {
            WillReturn.Add("4");
            WillReturn.Add("0 1 1 0");
            //1
            //同じ座標の点が与えられる場合もあります
        }
        else {
            string wkStr;
            while ((wkStr = Console.ReadLine()) != null) WillReturn.Add(wkStr);
        }
        return WillReturn;
    }

    static void Main()
    {
        List<string> InputList = GetInputList();
        int[] XArr = InputList[1].Split(' ').Select(X => int.Parse(X)).ToArray();

        //重複を排除してから昇順にソート
        XArr = XArr.Distinct().OrderBy(X => X).ToArray();

        //同じ座標でない2点を選べない場合
        if (XArr.Length == 1) {
            Console.WriteLine(0);
            return;
        }

        int UB = XArr.GetUpperBound(0);

        int MinDiff = int.MaxValue;
        for (int I = 0; I <= UB - 1; I++) {
            int Diff = XArr[I + 1] - XArr[I];
            if (MinDiff > Diff)
                MinDiff = Diff;
        }
        Console.WriteLine(MinDiff);
    }
}


解説

X座標をDistinctしてからSortしておき、
総当りで差を調べてます。