トップページに戻る
次の競技プログラミングの問題へ
前の競技プログラミングの問題へ
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しておき、
総当りで差を調べてます。