トップページに戻る
次の競技プログラミングの問題へ
前の競技プログラミングの問題へ
ARC-028-A 小石を取るゲーム
■■■問題■■■
アリのAntさんとBugくんは小石を取るゲームをしています。
このゲームのルールは以下の通りです。
●最初、N個の小石が袋に入っています。
●Antさん、Bugさん、Antさん・・・の順番で交互に袋から小石を取っていきます。
●Antさんは1回につきちょうどA個の小石を取ります。
ただし、袋の中の小石がA個未満である場合は、袋の中の全ての小石だけを取ります。
●Bugくんは1回につきちょうどB個の小石を取ります。
ただし、袋の中の小石がB個未満である場合は、袋の中の全ての小石だけを取ります。
●自分のターンで袋を空にすると勝ちとなります。
Antさんはどちらがこのゲームに勝つかを計算してみることにしました。
■■■入力■■■
N A B
1行目には、最初に袋に入っている小石の数を表した整数 N(1 <= N <= 1000) と、
Antさんが一度に取る小石の個数を表した整数 A(1 <= A <= 1000) と、
Bugさんが一度に取る小石の個数を表した整数 B(1 <= B <= 1000) が
空白区切りで与えられる。
■■■出力■■■
勝者がAntさんである場合はAnt、
勝者がBugくんである場合はBugと1行に出力せよ。
出力の末尾に改行をいれること。
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("5 1 2");
//Bug
//以下のようにゲームが進行します。
//●Antさんが小石を1つ取り出す。袋には4個の小石が残る。
//●Bugくんが小石を2つ取り出す。袋には2個の小石が残る。
//●Antさんが小石を1つ取り出す。袋には1個の小石が残る。
//●袋には1個しか小石が入っていないので、Bugくんが小石を1つ取り出す。
//●Bugくんのターンで袋が空になったのでBugくんの勝ちとなる。
}
else if (InputPattern == "Input2") {
WillReturn.Add("10 3 4");
//Ant
//2回目のAntさんのターンでちょうど袋が空になります
}
else {
string wkStr;
while ((wkStr = Console.ReadLine()) != null) WillReturn.Add(wkStr);
}
return WillReturn;
}
static void Main()
{
List<string> InputList = GetInputList();
int[] wkArr = InputList[0].Split(' ').Select(X => int.Parse(X)).ToArray();
int N = wkArr[0];
int A = wkArr[1];
int B = wkArr[2];
bool IsAntTeban = true;
while (true) {
if (IsAntTeban) {
if (N <= A) {
Console.WriteLine("Ant"); break;
}
N -= A; IsAntTeban = false;
}
else {
if (N <= B) {
Console.WriteLine("Bug"); break;
}
N -= B; IsAntTeban = true;
}
}
}
}
解説
ナイーブにシュミレーションしてます。