Toy と帽子と ADP BE

主にプログラミングに関わる話をゆるくエモくやっていきます

サントリープログラミングコンテスト2023(AtCoder Beginner Contest 321)

4完

各問題

A - 321-like Checker

チェックするだけ。

B - Cutoff

制約が小さいので全探索可能です。Nラウンド目のスコアを0から順に仮定して最終結果を計算し、X以上になったらそれが答えで、100でもX以上にならなかったら何点取っても無理なので -1 です。

C - 321-like Searcher

1から順にチェックしていきます。一番大きいものは 9876543210 なので int をはみ出る程度には大きく全探索は無理なのですが、隣り合う二つの桁で「( x の上から i 桁目 ) <= ( x の上から i+1 桁目 )」となったときは( x の上から i 桁目 )を一つ増やし、それ以下の桁をオール0にしたものから再度チェックするとすれば大幅にショートカットできます。

例えば 84400 がだめとわかった時点で、次の 84401 から 84999 まではチェックしても無駄なわけです。

あと、最初全然わからなかったのですが(先に D を通した)、Clar をで K が有限ということが判明してからようやくとっかかることができました。

D - Set Menu

まず、B をソートしておきます。そして各 A に対して (P - A_i) で B を二分探索して、A_i + B_j が P 以上になる j を特定します。j 以降はすべて P になります。j より前については A_i + B_j となりますが、B の(ソート後の)累積和をとっておけば 1 から j-1 の範囲を一発で計算できるので問題ありません。

E - Complete Binary Tree

(1を根とした木として考えています)

x の子の部分については(多分)答えを合わせられたのですが、一度親の方に行ってから下る部分の考え方が何か間違っているらしく、最終的な答えは合うか一つ少ないかになってしまいました...。うーん。

まとめ

E が迷走して重実装になってしまいリカバリーできなかったのがもったいなかった。