AHC031
やったこと
- 縦に切った盤面を構築し、日ごとには横線のみを更新する
- 縦線の切り方は、 日間動かさずに耐えられる範囲でなるべく細く切る
- 切った後の分け方は、なるべく細いところで入るだけ入れる
- 列ごとに、翌日と全く同じ位置で切れるなら切る(列のすべての切れ目がキープできる場合のみ)
- 縦線の集合を決めると貪欲で決める
- 左から順に貪欲に使うマスを決める(入るやつをなるべく大きく取る)
- その後右から順に「区切り線を前日と完全一致させられるなら一致させる」をする
- 縦線の集合の決め方は適当に焼きなまし
- 序盤は「区切り線を前日と完全一致させられるなら一致させる」を入れない
- 後半はスコアそのものを評価関数
やりたかったこと
たぶんこれをやると結構伸びる(実験した感じ、列ごとの要素数が多いものだと 2 倍ぐらい良くなりそう)と思ってたけど実装がむずすぎて 5 日ぐらいかかっても実装しきれなくて泣いてた *1 。
- 列を初日から順に、貸出先とその順列ブロックを決める
- 左右どちらかと同じ高さになるところに「切れ目」を設けて、各切れ目間に入る貸出先の集合(「ブロック」と呼ぶ)および左右のどの切れ目と対応するかのみを保持する
- 具体的な高さは決めない(上の情報からなるべく高さが低くなるように計算できる)
- 各長方形の高さは自由度を持たせておく
- 各日の中では、下から順にブロックを決める
- 列ごとに をしていい感じに決める
- :下から 個の貸出先まで決めたときの最適状態たち
- 最適判定は、前日との共通切れ目の個数、(同じなら)動かせる自由度の大きさ、全体で必要な高さ、の辞書式順序で
- 遷移は を求めるときは をすべて調べる。
- 列ごとに をしていい感じに決める
- 探索の方法は
感想
- 短冊はすぐ思いついたけどそこからの伸びが・・・
- DP 実装仕切りたかった。
ビジュアライザ
今回はいつもに比べて公式の機能が少なかった気がする *2 。
長期コンは考察しやすいように自作するのが良さそう。
#AHC031
— きり (@kiri8128) April 1, 2024
ビジュアライザはこんな感じにしてた。
前日と異なる線は左半分、翌日と異なる線は右半分が赤くなる。
灰色は不要部分。
長方形をクリックすると Information Box に表示されるいつものやつ。
動画は Seed 5 で 3 万切るぐらい https://t.co/t9EMhmTnao pic.twitter.com/BF6lP0BMIq
おまけ
順位表ビジュアライザも作ってた
— きり (@kiri8128) April 1, 2024
(変動が分かりやすいようにしてた)#AHC031 pic.twitter.com/Z8fV69JiLH
End