【C#】AtCoder Beginner Contest180 D - Takahashi_Unevolved をC#で解いてみた【AtCoder】

※この解答は個人の見解の為、参考程度にご覧ください。

問題文

f:id:tomdokkk:20201102202059p:plain

コメント

ゲームのパラメータ調整ですごく使いそうな感じのアルゴリズム
難しかったけど、解いてて楽しかった。
最初自分で書いたコードは、サンプルテストケースはうまくいったけど他のテストケースはWA出しまくってどうしようもなかった。
結構うまく書けたと思ったのになあ…。
ネットで天才エンジニアの人が書いたの参考にプログラムを書き直した。

プログラムの勉強は
①まず自分で書いてみる。
➁ネットのすごい人のを参考に書いてみる。
➂分からない処理は分かるまで調べる。
④自分のコードとミックスしてみる。
が、結構自分の中でイイ感じである。


自分で書いてみたコード

        static void Main(string[] args)
        {
            var input = Console.ReadLine().Split(" ");
            var X_Power = long.Parse(input[0]);
            var Y_EvolLevel = long.Parse(input[1]);
            var A_doublePower = long.Parse(input[2]);
            var B_addPower = long.Parse(input[3]);
            long Experience = 0;
            List<long> list = new List<long>();

            for (int i = 1; i <= Y_EvolLevel; i++)
            {
                //基礎パワーを退避
                var x = X_Power;

                //ループの数だけパワーを倍増
                x = x * (A_doublePower * i);
                Experience++;
                //値チェック
                if (x > Y_EvolLevel)
                {
                    Experience--;
                    list.Add(Experience);
                    break;
                }

                //ループの数だけパワーを倍増
                for (int j = 1; j <= Y_EvolLevel; i++)
                {
                    if (x + B_addPower * j < Y_EvolLevel)
                    {
                        Experience++;
                        x += B_addPower * j;
                    }
                    else if (x + B_addPower * j == Y_EvolLevel)
                    {
                        Experience++;
                        break;
                    }
                    else
                    {
                        break;
                    }
                }

                list.Add(Experience);
                Experience = 0;
            }

            list.Sort();
            var count = list.Count;
            Console.WriteLine(list[count - 1]);
        }

解答例

        static void Main(string[] args)
        {
            var input = Console.ReadLine().Split(" ");
            var X = int.Parse(input[0]);
            var Y = int.Parse(input[1]);
            var A = int.Parse(input[2]);
            var B = int.Parse(input[3]);
            long Experience = 0;

            while (true)
            {
                //加算値より強さが大きい時
                //倍化しつくした残りの値で、まだ加算の余地がある場合にここにくる
                if (X >= B)
                {
                    //経験値に加算 (進化レベル - 1 - 強さ(値を反映させた現在の強さ)) / 加算値
                    //-1しないと進化レベルぴったりになるので避ける
                    Experience += (Y - 1 - X) / B;
                    break;
                }

                //強さを倍化させた値が進化レベルに届いていない時
                if (X * A < Y)
                {
                    //経験値に1を加算
                    Experience ++;
                    //倍化させた値を強さに反映
                    X = X * A;
                }
                //進化レベルに届いてしまったら倍化した値を反映させず、加算値を残り全清算
                else
                {
                    //経験値に加算 (進化レベル - 1 - 強さ) / 加算値
                    Experience += (Y - 1 - X) / B;
                    break;
                }
            }

            Console.WriteLine(Experience);

        }