たくあんポリポリ

勉強したことを載せていきます。最近、技術系の記事はZennに書いています。(https://zenn.dev/chittai)

【AtCoder】【C#】AtCoder Beginner Contest 149 の反省

AtCoder Beginner Contest 149のコンテストに参加したので、その感想を残しておきます。今回はUnratedのため、レーティングには関係ないですが、A-Dまで解いたので、その中での反省を書きます。

はじめに

コンテストへのリンク

atcoder.jp

解いた問題

A-D問題を解きました。

解答説明

A問題

C#において文字列の結合は”+”でできるので、やるだけ。

実装 AtCoder/A.cs at master · chittai/AtCoder · GitHub

B問題

Kの値で場合分けをします。K < A の時は、Aから先に食べていくのでAはA-Kとなり、Bはそのまま残ります。A <= Kの場合はK-Aしたあと、残っているBからK-Aを引きます。それ以外は全部食べれるので、A,B共に0になります。

実装 AtCoder/B.cs at master · chittai/AtCoder · GitHub

C問題

Xから順に値が素数かどうか確認します。これは、前に素数か判定するライブラリを作っていたので、それを使いました。

static bool IsPrimeNumber(int number)
{
    double i = number;
    // 平方根を求める
    double x = Math.Sqrt(i);
    // 平方根以下の値で割り切れるのか確認する
    // 最小値は2
    for (double j = 2; j <= x; j++)
    {
        if ((number % j) == 0) { return false; }
    }
    if (number == 1) { return false; }
    return true;
}

同じ回答数でも速度によって順位がだいぶことなるので、こういう関数を用意しておいてスピードアップをはかるのは良いかなと思います。

実装 AtCoder/C.cs at master · chittai/AtCoder · GitHub

D問題

  • じゃんけんでグーで勝った時はR点、ちょきで勝ったらS点、パーでかったらP点獲得できる
  • インプットでKが与えられるが、K回目と同じ手はだせない
  • 得点を最大化したときに何点とれるか

最初に考えたこと

単純に、最初の手から勝てる方法を考えました。K回目に同じ手がでたとしても最初と最後どちらかを取るか決めるだけなので、点数自体には関係ないと考えました。ただ、そのま実装するとWAを喰らいます。

次に考えたこと

何が駄目かというと、ようは、あいこにするか負けるかをちゃんと選ばないといけません。そのためにはK番あとに相手が何をだしているか判定します。

例として、ぐー→ぐー→ちょきとしたときに、ぱー→ぐーと出してしまうと、次のちょきで勝てなくなるのでぱー→ちょき→ぐーとする必要があります。このあたりの処理をif文で実装しました。

こういった、ケースの想定ができずWA食らうケースがそれなりに多いので、もっと問題の本質を理解できるようにならないとノーミスは難しそうだなと感じました。

実装 AtCoder/D.cs at master · chittai/AtCoder · GitHub

感想

今回も、D問題まではそんなに難しくなかったので早解きが順位を分ける鍵だったのかなと思います。反省だけじゃなく、どうすればもっと問題がとけるようになるのか分析が必要になってきそうです・・