解いた問題
- ABC045 C - Many Formulas
- ABC102 C - Linear Approximation
- AGC005 A - STring
- APC001 B - Two Arrays
- ABC114 C - 755
- ARC140 B - Shorten ARC
ABC045 C - Many Formulas
感想 (解答中に考えたこと)
eval
で解けてしまいそうだが、本質じゃないので使わない。- 各数字がどの桁で幾つ現れるかを考えれば良い。
- 基本的にどの数字も桁目は個現れる。ただしを現れる回数とする。
- また各数字が使える回数は数式のパターンの数分なのでで、にて桁目であった数字が桁目以降に現れるはずがない。よって桁目の数字をとして、その寄与は。最後にの分を補正すれば良い。
提出コード
まぁbit全探索で良い atcoder.jp
ABC102 C - Linear Approximation
感想 (解答中に考えたこと)
- 絶対値の和の最小化なので、どうせ中央値あたりを考えれば良さそう。
- のように変形すれば、の中央値を求めれば終わり。
提出コード
なんと、のソートを忘れていたらしく……(3WA) しかし数列の長さが偶数のケースを無視していたが、通ってしまった。 atcoder.jp
AGC005 A - STring
感想 (解答中に考えたこと)
- 左から消去っていうのが効いてきそう?とりあえずランレングス圧縮する。
- 左端の文字が
T
である場合は無視すれば良いので、S
から始まる文字列のみ考えれば良い。 - 個
S
が連なっているものを、T
が連なっているものをとする。- であれば、消去操作は回
- であれば、消去操作は回で、次の
S
のまとまりの個数にを加える。
- が答えになる。
提出コード
左から捜索して特定の文字列になったら削除はStackで管理、めちゃ典型だ……。 atcoder.jp
APC001 B - Two Arrays
感想 (解答中に考えたこと)
- APCなんてものがあるんですね……。で表されるからなす数列を考える。ここで操作は以下のように言い換えられる。
- を選び、に2を加算。に-1を加算。
- 上の操作によって全てのをにすることが目標。
- このことからとしたとき、が操作回数になる。これ以上操作をするとの和が1以上になるので一致することはなくなる。同様に未満の操作回数でも一致しない。
- の各要素から最短でにする方法を考える。また、する回数とする回数を分けてカウントする。
- が正数であるならば、をその数だけ繰り返せば良い。
- が負数であり、偶数であるならをその数/2回繰り返す。奇数ならば(その数+1)/2回を繰り返した後にを1回行う。
- 最後にとの回数およびから判定をする。
- の回数がよりも大きければ
No
- の回数がよりも大きい場合、余剰分をを1回とを1回で繰り返せばの要素は全て0になる必要条件を満たし、操作回数がと同じになれば
Yes
- その他回数が同じだった場合やが負数の場合の処理を書けば良い
- の回数がよりも大きければ
提出コード
ABC114 C - 755
感想 (解答中に考えたこと)
- 上位の桁を固定しながら和を取るのが簡単そうだが、同様のもので桁DPがある。練習がてら桁DPで解いてみる。
- 上から桁目を見た時、数字の使われ方が状態 (ビット)である場合の数。ただしは上位桁目まで一致しているかどうかのbool値。
- 上位の桁を0埋めする場合が考えられ、また3057のように途中に0を入れてはいけないので、bitで探索するときも0のみ特別に扱う必要がある。
- あとは桁目の数字との状態から丁寧に丁寧に丁寧に状態遷移を実装してあげれば良い。
提出コード
苦しすぎた…… atcoder.jp
ARC140 B - Shorten ARC
感想 (解答中に考えたこと)
ARC
であればどのタイミングで操作してもよく、AARCC
であれば奇数回目で操作すると偶数回目でAC
まで変化できて嬉しい。つまりAARCC
とARC
の個数がわかればよいのでは? -> WA- 考えてみたがわからんので解説をチラ見。なるほど、
A...ARC...C
を常に奇数回目で操作するようにすれば、両端のA
あるいはC
の個数の小さい数ぶん操作が可能になる。 - つまりランレングス圧縮する過程で
A...ARC...C
の塊の情報を整理すれば見通しが良くなりそう。 - あとは奇数回目であれば
ARC
以外のものを優先して操作し、偶数回目であればARC
を優先して操作することが必要になる。 - 実装方法に迷ったが、操作回数は高々回で抑えられるだろう(操作することにより、1文字あるいは2文字消去なので)。なのでpriority_queueを使って愚直に勘定するのが良い。