目次

CodeQUEEN 2024 予選 (AtCoder Beginner Contest 358) G問題メモ

CodeQUEEN 2024 予選 (AtCoder Beginner Contest 358)

いつもよりF,Gが簡単め?(面倒くささは除いて)

G - AtCoder Tour

G - AtCoder Tour

問題文

制約

解法

最適な行動は、「始点からどこかのマスへ辿り着く」→「辿り着いたら、そこに留まり続ける」となる。

留まるマスを T とする。T は、S から T に行くのに経由したマスの中で、Ai,j が単独最大のマスであるとしてよい。
T の他に最大マスがある場合、代わりにそこで留まり続けて損しない)

また、S から T に行く過程の途中で留まったり、同じマスを2度通ったりする必要も無い。(その分、速く T に着いて留まる回数を多くした方がいい)

当然、Ai,j が大きいマスを T とした方がよいが、 遠くにはるばる行くより近場のマスを選んだ方が K によっては最善となることもある。

S 9 1 ...  1    10に辿り着くために1の海をはるばる泳ぐより、
1 1 1      1    9で留まった方がよいこともある。
:          :
1 1 1 ... 10

また、途中の経路も、速く着いた方が長く T に留まれるが、 少し迂回して Ai,j が大きいマスを経由した方がよい場合もある。

 S 9 9  最短で下に行くより 9 を拾っていった方がいい
 1 1 9
10 9 9

このために、S から単なるコストや移動回数を持った経路探索をしても、上手く最適を求められない。

目標マスを固定

制約から O(H2W2) が間に合いそうなので、 「T を全探索」→「T を固定した条件でグリッド探索」してもよい、ということになる。

T マスに書かれた値を AT とする。
仮に「K 回全てで AT を得られた」とすると総計は KAT で、これをまず貰っておく。
実際には辿り着くまでに踏む各マス (i,j) に対し、ATAi,j だけ減少する。

これをコストとして、S から T までDijkstraをすると、T を固定した場合の答えが求まる。
前述の通り、探索するマスは Ai,j<AT であるマスのみとしてよいので、コストは常に非負である。

Python3

解法2

どこに T を設定しようと、また、S からどんなルートを辿ろうと、HW 回以内には必ず、最適なルートで T に辿り着いている。

として、kHW(2500) までの範囲を探索すれば、それぞれの状況からさらに (i,j)Kk 回留まり続けた中での最大値が答えとなる。

同じマスを2回経由するルートなども探索されてしまうが、考え方はシンプルになる。