ABC358

F以外の6完。しょーもな。

A - Welcome to AtCoder Land

getlineを思ったが、愚直にやる。細かいことを考える時間はない。

B - Ticket Counter

自分にとっては嬉しい問題。考察難度が高く、実装は軽い。現在の行列がいつまでにはけるかの変数を持って更新していけばよさそう。実はそれが答えにもなっている。

C - Popcorn

文字列の情報はビットで持てば楽で、全探索するだけ。2^Nと2^Mが両方現れるの珍しくて、ちょっとびっくりして警戒。

D - Souvenirs

AもBもソートしていい。Bの小さいのから貪欲に小さいAを割り当ててよさそう。しゃくとりみたいにやる。少し考えたけど、結局証明できないまま提出。350点であることに甘えたきらいはある。まあ、Bの最小の要素にとって、俺が選ばなかったら誰が選ぶんだよになるし、そのAの要素が誰にも選ばれなかったら入れ替えて小さくできるしなあ。でもきれいに示せない。

E - Alphabet Tiles

数え上げはずいぶん久しぶりに感じる。これが全然わからなかった。25分くらいかかってる。ここでトイレに行った。26乗は無理だよなーとか言ってた。そもそも各文字を何個使うか決まっていたときでさえすぐにはわからなかったが、まあさすがにこれは簡単で、二項係数でできる。そこから考えて解法に到達した。DPしようにもまとまらないと思っていたが、文字種を1個ずつ追加すれば、今何文字かでまとまる。dp[i][j]を、英大文字の最初のi文字だけを使って長さjの文字列を作ったときの通り数とする。実際には、状態iは持たずメモリを節約する。今思ったけど、文字種を1個ずつ追加するのはナップサック的な難しさだな。

F - Easiest Maze

Fを読んで、やばさを感じて順位表を見て、Gが解かれているのでGも読むことにした。交互に考えて、先にGが解けたのでGをやった。

なんか全てのマスを通るのだと思ってた。「Kって何だ!?」となって気づく。Kにする調整が厄介そうだと思ってGをやっていたが、真面目に考えたらできた。SからGへ一直線に下がるのをベースとして、左にふくらむと長さが2増える。市松模様にして考えると、KとNの偶奇は一致する必要がある。Nが奇数のときは最後左にふくらんだとき帰りに下に1だけふくらんで回収できるので、偶奇の必要条件は十分条件にもなっている、と思いきやサンプル2を見ると一直線より小さいKというのを見せつけられる。こういう、サンプルで敗北するのけっこうこたえる。実装の方針として、まず経路の通る順に番号を付ける。そこから壁を復元できないか考えると、差が1かどうかで判定できる(通らない場所が0とすると、1との差が1になってしまうので、番号は10からにした(使わなかったが、デバッグ出力するとき桁数が揃うことを見ていた))。Nが奇数のときの実装きつかったね。サンプル合わなかったのは、Nが奇数のときの+1と-1の間違い(帰りににょろにょろする方針にしちゃったからややこしい)と、出力のとき縦横の壁でM-1個とM個で違うのにコピペしてそのままだったところ。一応サンプル3が、壁はないものの、答えが1通りしかないやつなので、最低限のチェックはできる。

G - AtCoder Tour

ずっと、留まることができない設定で考えていた。Kがでかいので、2500回くらい愚直にやって、K回のうち中央の大部分を占めるループとそれ以外に分けて全探索とか。ループを考えるとき、同じマスは2回通らないとしていいかとか(交差していれば効率のいいループを切り離してそこだけやればよさそう)。組み合わせがなかなか網羅できない。2500回で足りるかもわからんし。ダブリングも考えたが、更新の仕方を考えると、できない。

誤読に気づいて解けた。留まることができるなら、経路上楽しさ最大のマスに留まり続けるのが最適。各回数で各マスにいるときの最大値を求めていく。スタート地点が決まっているので、そこだけ0にして他は-INF。隣接マスを見て更新。そこで留まり続けるときの合計を求めてその最大値が答え。スタート地点で留まり続けるケースを忘れずに。簡単すぎるだろ(何か見落としてるか?)。