トップページに戻る
次の競技プログラミングの問題へ
前の競技プログラミングの問題へ
ABC-056-C Go Home
■■■問題■■■
無限に左右に伸びている数直線上の 0 の地点に時刻 0 にカンガルーがいます。
カンガルーは時刻 i-1 から i にかけて、
なにもしないか、もしくは長さがちょうど i のジャンプを、左右どちらかの方向を選んで行えます。
つまり、時刻 i-1 に座標 x にいたとすると、時刻 i には x-i, x, x+i のどれかに存在することが出来ます。
カンガルーの家は座標 X にあります。
カンガルーはできるだけ早く座標 X まで移動しようとしています。
カンガルーが座標 X に到着する時刻の最小値を求めてください。
■■■入力■■■
X
●Xは整数
●1 <= X <= 10億
■■■出力■■■
カンガルーが座標Xに到着する時刻の最小値を出力せよ。
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("6");
//3
//3回右にジャンプすると時刻3に家にたどり着けて、これが最小です。
}
else if (InputPattern == "Input2") {
WillReturn.Add("2");
//2
//時刻0にはなにもせず、
//時刻1に右にジャンプすることで時刻2に家にたどり着けます。
}
else if (InputPattern == "Input3") {
WillReturn.Add("11");
//5
}
else {
string wkStr;
while ((wkStr = Console.ReadLine()) != null) WillReturn.Add(wkStr);
}
return WillReturn;
}
static void Main()
{
List<string> InputList = GetInputList();
int X = int.Parse(InputList[0]);
int SumVal = 0;
for (int I = 1; I <= int.MaxValue; I++) {
SumVal += I;
if (X <= SumVal) {
Console.WriteLine(I);
break;
}
}
}
}
解説
マイナス方向のジャンプを行わないとして、
0秒で到達可能な座標は0
1秒で到達可能な座標は0 1
2秒で到達可能な座標は0 1 2 3
3秒で到達可能な座標は0 1 2 3 4 5 6
4秒で到達可能な座標は0 1 2 3 4 5 6 7 8 9 10
5秒で到達可能な座標は0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
6秒で到達可能な座標は0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
といった形で等差数列の和までの座標に到達可能だと分かります。
また、マイナス方向のジャンプが意味をなさないことも分かります。
以上をふまえて、等差数列の和を順に求めて解いてます。