A - Picnic Editorial
by
yukipom
89位解法
毎ターンの貪欲配置をベースに、「空きマスの将来価値」を評価関数の1つの項に集約し、適応的な受入選別と限定的な移動を組み合わせました。ビームサーチや先読みはしていません。
1. 全体像
グループが到着したら、
- 単価による受入選別(後述)で明らかに安い客を断る
- 矩形と歪な塊の両方の配置候補を、共通の評価関数で採点して最良を選ぶ
- 幾何的に置けない・形が悪い場合は、既存グループを1つ退かして場所を作ることを検討する
という流れです。
2. 配置の評価関数
候補配置(形と位置)を次の和で採点し、最小のものを選びます。
\[\mathrm{score} = -V \cdot C + \sum_{\text{マス}} d(\text{池・盤外までの距離}) + \lambda \cdot \Delta N_{3\times3} + w_r \cdot (\text{周囲の空き数})\]
- fee 項 \(-V \cdot C\):この形で置いたときに退去時に得る利用料。\(C = 4\sqrt{P}/L\)(\(L\) は周長)
- 容量項 \(\lambda \cdot \Delta N_{3\times3}\):「\(3\times3\) の正方形が置ける左上位置の数」がこの配置で何個潰れるか(\(\lambda = 900\))。空きマスの将来価値(後続を置ける機会のオプション価値)をこの1つの量で代表させています
- 距離場:池・盤外からの多点BFS距離の、配置マスでの合計。小さいほど「岸」に張り付く配置になります
- リング項:候補の周囲1〜3列に残る空きマスの数。少ないほど壁に密着しています
fee は他の項より桁が大きいので、実質的には「まず fee を最優先し、fee が拮抗する候補の間では盤面を壊さない場所を選ぶ」という挙動になります。
3. 形状の生成
矩形:\(w+h\)(半周長)のクラス昇順に列挙し、各行を u64 で持つビットボードの AND シフトで配置可能位置をまとめて求めます。最小半周長の \(1/0.6\) 倍までの細長さを許容しました。
歪な塊:空き連結成分の中で貪欲成長させます。追加マスのキーを「塊内隣接数 × 5 + (4 − 池・壁接触数)」としたバケットキューで、種を数百箇所 × 成長規則3種(スタック/キュー × 壁重みの有無)試します。得られた塊も矩形と同じ式(+固定バイアス1000)で採点し、良い方を採用します。
4. 受入選別(単価の適応分位)
単価を \(\mathrm{dens} = V / (P \cdot (T - S))\) とし、観測した全到着の単価履歴の適応的な分位点を閾値にします。分位 \(\alpha\) は需給比から決めます。
\[\rho = \frac{\text{確定済みの占有(面積×残り時間)} + \text{将来到着の期待需要}}{\text{芝生面積} \times \text{残り時間}}, \qquad \alpha = 1 - \eta / \rho \quad (\eta = 0.8)\]
将来需要は「残り到着数 × 平均 \(P\) × 打ち切り補正した平均滞在時間」で見積もります。補正は次の3つです。
- 空き率が高いときは分位を線形に緩める(断り損ね防止)
- 面積×時間が小さい客は素通し(断っても得られる余裕がわずか)
- 置ける形の \(C\) を織り込んだ実効単価でもう一段締める(形の悪い置き方しかできない客は割高)
\(\rho\) の将来項は終盤に自然と 0 に向かうので、終盤は選別が自動で全開になります。
盤面適応:最大内接正方形の辺(\(O(N^2)\) DP)が 14 以下の断片化盤面では、\(\eta\) を下げ・\(\lambda\) を上げ・塊の局所改善を有効化・選別の発動を早める、の4点をまとめて切り替えます。この特徴量は「自分のスコアを、幾何を無視した理論上界で割った達成率」との相関が +0.81 で、盤面の強弱をほぼ1変数で説明できました。
5. 移動(3系統)
移動は探索の主役ではなく、限定的な補助です。
- デフラグ:毎ターン最大1グループ、同じ矩形のまま「潰している \(3\times3\) 位置数」が減る場所へ動かします。検討対象は利用中グループの一部(最大64組)で、開始位置を毎ターンずらしながら巡回することで、全グループが順番に検討されるようにします
- 退避して受け入れる:幾何的に置けないとき、空き成分に隣接する既存グループを1つ退かし、合体した空きに新客の塊を育て、退かした相手を再配置します。相手の \(C\) は滞在中の最小値なので、形が悪くなる移設は fee 損として価格に入れて採算判定します
- 矩形を彫る退避:塊でしか置けないとき、矩形の \(P\) マス領域を占有している1グループを退かして矩形で置きます。この比較のときだけ幾何項を 0.6 倍に割り引いて採算判定します(容量項が大矩形を過大に罰するのを補正)。見込み利得 \(V \cdot (C_{\max} - C_{\text{塊}})\) が小さいターンでは発動しません
6. 終盤モード
最終ターンは将来が存在しないので、幾何項をすべて捨てて fee 純粋最大化にします。
さらに一般化して、「観測した \(P\) の99%分位 × 残り到着数」が空き面積に収まる間は同じモードに入ります。この需給ガード自体が発動範囲を最後の10ターン弱に自己制限してくれるので、しきい値の調整は不要でした。
7. 高速化と時間管理
- 盤面は行ごとの u64 ビットボードで持ち、距離場・容量・占有はすべて2次元累積和で \(O(1)\) 参照。
- 制限 2s に対して内部リミット 1.35s とし、経過時間に応じて種数・成長規則数を縮退させます。実行時間は最大ケースで約 1.36s でした。
posted:
last update:
