昨晩開催された 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問題は全く歯が立たなかったので、解説動画を見て、同様の問題が解けるようにしたいと思います。
次回も頑張ります。