トップページに戻る
次の競技プログラミングの問題へ
前の競技プログラミングの問題へ
ABC-086-C Traveling
■■■問題■■■
シカのAtCoDeerくんは二次元平面上で旅行をしようとしています。
AtCoDeerくんの旅行プランでは、
時刻0に点(0,0)を出発し、
1以上N以下の各iに対し、時刻tiに点(xi,yi)を訪れる予定です。
AtCoDeerくんが時刻tに点(x,y)にいる時、
時刻 t+1 には 点(x+1,y),(x-1,y),(x,y+1),(x,y-1)のうちいずれかに存在することができます。
その場にとどまることは出来ないことに注意してください。
AtCoDeerくんの旅行プランが実行可能かどうか判定してください。
■■■入力■■■
N
t1 x1 y1
t2 x2 y2
・
・
・
tN xN yN
●1 <= N <= 10万
●0 <= xi <= 10万
●0 <= yi <= 10万
●1 <= ti <= 10万
●ti < ti+1 (1 <= i <= N-1)
●入力は全て整数
■■■出力■■■
旅行プランが実行可能ならYesを、不可能ならNoを出力してください。
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("2");
WillReturn.Add("3 1 2");
WillReturn.Add("6 1 1");
//Yes
//例えば、(0,0),(0,1),(1,1),(1,2),(1,1),(1,0),(1,1)
//と移動すればよいです。
}
else if (InputPattern == "Input2") {
WillReturn.Add("1");
WillReturn.Add("2 100 100");
//No
//(0,0)にいる状態から2秒後に(100,100)にいるのは不可能です
}
else if (InputPattern == "Input3") {
WillReturn.Add("2");
WillReturn.Add("5 1 1");
WillReturn.Add("100 1 1");
//No
}
else {
string wkStr;
while ((wkStr = Console.ReadLine()) != null) WillReturn.Add(wkStr);
}
return WillReturn;
}
static void Main()
{
List<string> InputList = GetInputList();
int[] wkArr = { };
Action<string> SplitAct = pStr =>
wkArr = pStr.Split(' ').Select(X => int.Parse(X)).ToArray();
int PrevT = 0;
int PrevX = 0, PrevY = 0;
foreach (string EachStr in InputList.Skip(1)) {
SplitAct(EachStr);
int CurrT = wkArr[0];
int CurrX = wkArr[1];
int CurrY = wkArr[2];
int DiffT = CurrT - PrevT;
int DiffX = Math.Abs(CurrX - PrevX);
int DiffY = Math.Abs(CurrY - PrevY);
if (DiffT < DiffX + DiffY) {
Console.WriteLine("No");
return;
}
if ((DiffT - DiffX - DiffY) % 2 == 1) {
Console.WriteLine("No");
return;
}
PrevT = CurrT;
PrevX = CurrX;
PrevY = CurrY;
}
Console.WriteLine("Yes");
}
}
解説
(時間の差 - 変位の差) が 0以上であり、偶数かを判定してます。