2026年6月15日月曜日

第七回日本最強プログラマー学生選手権-予選-(AtCoder Regular Contest 222)

 Aしか解けず。

コンテスト後のツイート

B - Circular RPS

 解法ツイートを見てAC。

 コンテスト中は、正当性の怪しい三分探索にいってしまいダメだったし、a=0,b=cのようなケースも思いついていなかったため、全然ダメだった。

 冷静に、勝者が一人の場合、二人の場合、三人の場合について立式していったら解けた。配列から「二つの要素を選んで1ずつ減らす」という操作が何回できるか?(最大値が他の要素の和以上かによって場合分け) という頻出問題を意識したら分かりやすい。

 ただ、a=0,b=cのようなケースは全く頭から抜けていたので、コンテスト中にACできた可能性はなさそう。

C - 2 Directions vs 4 Directions

 解法ツイートを見てAC。

 分かってしまえばなんてことはない。
 三列ずつ動く感じになるというのはコンテスト中も考えていたが、端にいかないとそこからはみ出てしまうと勘違いしてしまった。実際は、横三マスをキープしたまま、一つずつずれて上下に動ける感じになる。

 手痛い考察ミスで、そういう変な思い込みをしてしまっては修正は難しかったと思うが、もっと落ち着いて考えられていたなら正しい考察ができていたようにも思う。

 AとBをすんなり通せていたら違ったのでは? とも思うけど、Bがすんなり通せた可能性はなさそうなので厳しい。

D - Shift and Add

 解説AC。

 下八桁くらいの数字と、その上の桁に9が何個続いているか? を持ってDPすれば良いと思って実装を始めたが、TLEやWAが出てダメ。
 まず、下八桁ではなく九桁が必要。そして、9が何個続いているか? ではその個数が複数あったときに計算量を減らせない。なので、「1を足したときに桁和がいくつになるか?」を持たなくてはいけなかった。

 また、桁和を求めるときは、int(str(x))を足していくのではなく、x%10を足してx//=10する、という風にした方が速い。その辺に気を配らないとTLEは取れなかった。(し、codonにしないとTLEは取れなかった)

 おおまかな解法はあっていたが、そこから実際にACするまでは遠い問題だった。

0 件のコメント:

コメントを投稿