AtCoderのABC
次のABCの問題へ
前のABCの問題へ
ABC178-E Dist Max
C#のソース
using System;
using System.Collections.Generic;
using System.Linq;
class Program
{
static string InputPattern = "InputX";
static List<string> GetInputList()
{
var WillReturn = new List<string>();
if (InputPattern == "Input1") {
WillReturn.Add("3");
WillReturn.Add("1 1");
WillReturn.Add("2 4");
WillReturn.Add("3 2");
//4
}
else if (InputPattern == "Input2") {
WillReturn.Add("2");
WillReturn.Add("1 1");
WillReturn.Add("1 1");
//0
}
else {
string wkStr;
while ((wkStr = Console.ReadLine()) != null) WillReturn.Add(wkStr);
}
return WillReturn;
}
struct PointDef
{
internal int X;
internal int Y;
}
static void Main()
{
List<string> InputList = GetInputList();
int[] wkArr = { };
Action<string> SplitAct = pStr =>
wkArr = pStr.Split(' ').Select(pX => int.Parse(pX)).ToArray();
var PointList = new List<PointDef>();
foreach (string EachStr in InputList.Skip(1)) {
SplitAct(EachStr);
PointDef WillAdd;
WillAdd.X = wkArr[0];
WillAdd.Y = wkArr[1];
PointList.Add(WillAdd);
}
long AddMax = PointList.Max(pX => pX.X + pX.Y);
long AddMin = PointList.Min(pX => pX.X + pX.Y);
long DiffMax = PointList.Max(pX => pX.X - pX.Y);
long DiffMin = PointList.Min(pX => pX.X - pX.Y);
var KouhoList = new List<long>();
KouhoList.Add(Math.Abs(AddMax - AddMin));
KouhoList.Add(Math.Abs(DiffMax - DiffMin));
Console.WriteLine(KouhoList.Max());
}
}
解説
(X1,Y1)と(X2,Y2)の2点のマンハッタン距離が最大であるとして、
X1 <= X2 とします。
2点間の傾きが正の場合は、
(X1+Y1) が最小の点と
(X1+Y1) が最大の点であれば、
マンハッタン距離が最大と分かります。
2点間の傾きが負の場合は、
2点をX軸で対称移動させれば、傾きが正になるので
(X1-Y1) が最小の点と
(X1-Y1) が最大の点であれば、
マンハッタン距離が最大と分かります。