れとろのメモ置場

とあるSEのメモ置場

AtCoder Beginner Contest 314

AtCoder Beginner Contest 314に参加しました。

結果

A,B,C,Dの4問正解でした。 E問題は問題文を読んでDPっぽいなあと思いました。カテゴリ的には確率DPとか期待値DPとか呼ばれる分類の問題かなと思って、考え方をググってました…
期待値DP難しい。 E問題はdiffが水色くらいかなと思ったけど青くらいあるっぽい。

A - 3.14

小数第100位までの円周率が与えられているので、指定された小数第N位までを出力する問題。

小数第100位までを数値系の変数で管理するのは無理そうだと思ったので文字列で対応することにした。 (C++で解いてるけど、doubelを使っても誤差がでそう。)

文字列として考えると、3.以降のN文字を出力すれば良くなるので 先頭からN+2文字の部分文字列を出力するだけの問題に置き換わる。

B - Roulette

ルーレットでN人がそれぞれC _ {i}個の出目に賭けたから、当てた人のうち賭けた出目が最小の人を番号順に出力する問題。

map[人i][出目]=賭けた/賭けていない を管理して、 当てた人だけを対象に賭けた出目数の最小値を探して、 当てた人だけを対象に賭けた出目数=最小値となった人を順番に出力していけば良い。

C - Rotate Colored Subsequence

文字が何種類かの色で塗られている文字列があるので、同じ色の文字内で1文字ずらしてできる文字列を答える問題。
aXbcYZという文字列で赤青赤赤青青となっていれば 赤のabc内で1文字ずらしてcbaになって、青のXYZ内で1文字ずらしてZXYになって、答えるのはcZabXYになる。

色別に配列を用意して対応する文字を順番に入れていき、 文字列の色の順番に合わせて各配列の文字を順番に出力していった。 文字列を出力する際、この色は配列の何番目を出力するっていうインデックスを色別に管理しておいて、そこを参照して その色用の配列の何番目を出力するというのを制御していた。 インデックスの初期値を-1にしておいて、出力する際は(インデックス値+その色の文字数) mod その色の文字数ってすることで N個要素がある場合にN-1、0,1,・・・N-1、0,1,・・・と配列の最後から順番に循環して参照できるようになる。

D - LOWER

文字列が与えられるので1文字置き換えるか全部小文字にするか全部大文字にするかの操作をQ回繰り返した結果を出力する問題。

文字列を全部大文字/小文字にするのは処理が重そうで操作のたびに実行してたらTLEする気がした。 そもそも1回小文字に変換してもその後また小文字に置き換えたり大文字に置き換えたりするかもしれないので、最後の1回以外は無視しても大丈夫なので無視した。
最後に大文字/小文字に置き換える処理が何回目の処理なのかを探索して、
その回数までは1文字置き換える処理だけを実行し、
その段階の文字列を大文字/小文字に置き換えて、
そこから先の処理(1文字置き換えのみ)は指示通りに実施して、結果を出力した。

E - Roulettes

問題文を読んでDPだろうなあと思った。DPの中でも期待値DPとか呼ばれてた気がするジャンルの問題だと思って、 考え方をググって色々な記事を読んでた。 解き方がまだ理解しきれていないから後でゆっくりでも解いておきたい。