れとろのメモ置場

とあるSEのメモ置場

Sky株式会社プログラミングコンテスト2023(AtCoder Beginner Contest 329)

Sky株式会社プログラミングコンテスト2023(AtCoder Beginner Contest 329)に参加しました。

結果

A,B,C,Dの4問正解でした。

C問題を考えすぎてロスしたり、E,F問題に手を出したものの解ききれなかったりした。

A - Spread

文字列が与えられるので文字と文字の間に空白を挟んで出力する問題。

文字列の内容を1文字ずつ出力しつつ、一緒に空白も出力させつつ、最後の文字だけは個別に出力すれば解ける。 ループとかで文字列を1文字つづ扱えれば解ける問題。

B - Next

複数の整数が与えられるので2番めに大きい値を答える問題。

整数をsetに入れて2番めに大きい値を取り出せば解けそうだけど、C++のsetは要素番号とかでアクセスできるタイプの型ではないので、大人しく配列にして降順にソートして2番めに大きな値を探して出力した。

C - Count xxx

文字列が与えられるので、1種類の文字だけで作れる部分文字列の種類数を答える問題。

はじめはしゃくとり法で答え候補の文字列を実際に作りながらsetで種類数を管理していたけどTLEになってだめだった。
なので方針転換してはTLEするというのを数回繰り返してどんどんシンプルになっていった。

最終的に各文字が最大で何個連続するかを数えて、最後に文字別の最大連続個数を足して行って答えとした。

いろいろ試していたけど、文字列の扱いをやめれば高速に処理できるようになっていたので、文字列をこねこねするのはそこそこ重い処理だったみたい。

D - Election Quick Report

N人の候補者に合計M票が投票されるので、1票ごとにその時点での当選者を出力する問題。
個人的にはC問題より簡単な気がした問題。

各候補者の得票数と現在の当選者、当選者の得票数を管理しつつ、
1票投票されたらその人の得票数と現在の最大得票数を比較して当選者を更新し出力していった。

D問題にしては簡単な気がする…

E - Stamp

だけで構成された文字列に対して上からスタンプを押すみたいに一部を指定された文字列に置き換えていった場合、指定された文字列が作れるかどうかを答える問題。

ある文字列を別のある文字列に変換できるかどうかというタイプの問題はゴールからスタートに向かって逆算していくのが定番の解き方だなあと思いつつ、文字列の操作は面倒だなあとか思いながら解き方を考えてた。

最終的にいい方法が思いつかなかったので後回しにすることにして時間内には解けなかった。

F - Colored Ball

N個の集合から指定された2つをマージしていく処理を繰り返していく問題。

E問題で悩んでいたときに順位表を見るとE問題よりF問題のほうが正解者数が多かったので、 こっちの方が解きやすいのかなと思って解いてみた。

結局時間内には解けなかった…

C++でsetをマージする関数があるには有ったけど、マージ後の一方は破棄されるみたいで 微妙にこの問題とは相性が悪くて使いづらかった。

なんだかPythonで解けば簡潔に解けそうな気はした。