昨晩開催された AtCoder Beginner Contest 407(ABC407) に参加しました!
今回は A〜C問題の3完 でした✨
大きなミスもなくC問題までは比較的スムーズに解けましたが、D問題は最後まで解法が思いつきませんでした。
それでもレートは 490 → 522 と、少し上昇してくれました!


💡 コンテスト結果

  • 解けた問題:A問題、B問題、C問題

  • D問題:提出できず

  • レート:490 → 522 (+32)


🟢 A問題

余り(a % b)が 0に近いのか、bに近いのか を判定する問題でした。

int m = a % b;
if (m <= b / 2)
    ans = a / b;      // 切り捨て
else
    ans = a / b + 1;  // 切り上げ

という感じで分岐すればOK。迷わず実装できました。


🔵 B問題

2つのサイコロを振って、

  • 出目の「合計」

  • 出目の「差の絶対値」

このどちらかが目的の値になる確率を求める問題。

サイコロは6面×6面なので、36通りを全探索してしまえばOK。
誤差の指定が 10⁻⁹ 以下だったので、C++では printf("%.10f", ) を使って出力しました。


🟣 C問題

ボタン操作で数列を作る問題。

  • ボタンA:末尾に0を追加

  • ボタンB:各桁を1つずつ増やす(9→0に循環)

最終的な数列が与えられ、空の状態から何回ボタンを押せばよいかを求めます。

✅ アプローチ:逆算!

例として、「407」 を作る場合を逆から考えてみました。

常に、末尾に0が追加されることになるので、そこから何回Bボタンを押すのかを考えれば良いです。

 

⑥ 407  ← Bボタンを7回  (末尾が0から7まで変化)

⑤ 730  ← Aボタンを1回  (末尾に0追加)

④ 73    ← Bボタンを3回 

③ 40    ← Aボタンを1回 (末尾に0追加)

② 4     ← Bボタンを4回 

① 0     ← Aボタンを1回 (末尾に0追加)

⓪       ← 初期状態

この場合、

  • Bボタン:4 + 3 + 7 = 14回

  • Aボタン:3回(桁数分)

合計 17回 の操作で目的の数列になります。

桁ごとに、次の桁値との差をとれば、Bボタンを押す回数がわかるというアイデアがポイントでした。


🔴 D問題

盤面上に縦または横にドミノを配置する問題。ここでストップ…。
ビット全探索で解けるのではないかと考えていたのですが、ドミノの縦置き/横置きの2パターンをどう扱うか分からず、時間切れ。かなり考えましたが、結局一度も提出することができませんでした。
後日、解説動画をしっかり見て復習したいと思います!


✍️ 感想と振り返り

今回は、C問題までしっかり解け、前回のリベンジとなりました
ただ、D問題は全く歯が立たなかったので、解説動画を見て、同様の問題が解けるようにしたいと思います。

次回も頑張ります。