/ 最近 .rdf 追記 編集 設定 本棚

log[20220129] JOIG 2021/2022 本選 過去問/F 問題 タクシ2 (Taxis 2)



20220129()

最終更: 2023-07-22T23:29+0900

[AtCoder] JOIG 2021/2022 本選 過去問F 問題 タクシ2 (Taxis 2)

 ステップ1

  • タクシーが赤色の場合,乗車後の所持金が a1 円にな
  • タクシーが青色の場合,乗車後の所持金a÷2 を整数に切り捨てた値円にな

1 から出発し,1 円以上の所持金を残した状態で町 Tj​ に到着するために,最初に少なくとも何円の所持金を持っている必要があるか

問題のこの部分はまあ逆に考えます。所持金が1の状態でスタトして所持金が +1 になる×2 になるというようにそうすれば初期金額を探索しなくて良いただしそれぞれの町をスタト地点に設定して町1への最短経路を繰り返し求めるということは許されていないのでスタト地点は町1のままにしておきたい

ところが町1を1円でスタトして+1/×2 しながら各町に着いたときいくらになっているかをダイクトラ法で求めてもサンプルが合わない合わなかった

たぶん-1/÷2 の逆計算は +1/×2 でいいのだけど((((-1)-1)÷2)-1)÷2 の逆計算は ((((×2)+1)×2)+1)+1 ではないとかってるけどその通りに計算できていないとかそういう理由

わからんなりにテーに 2×2 の正方行列に 2 とか 1 とか 0 を割り当てて実際に計算してみれば必要な係数が2つだということとそれをどう変化させればいいのかがわかったスクリトの中の x,y = x,x+yx,y = x+x,y というのがタクシーごとの変化式を見ても意味はわからない

 ステップ2

逆計算がわかったからダイクトラ法で解けたかというと小課題の4あたりから答えが稀にあわなかったり時間をオーバーしたりするした小課題の3までは問題のグラフが木だから複数の経路の競合がなかったのだな

これはたぶんある町における状態というのが所持金というパラメータ1つで優先順位を付けられないせいだと思うっき xy の式を2つ書いたけどそして所持金というのが d = x+y で表されるのだけどある町からある町へ移動するにあたりどちらのタクシーを使っても所持金の変化は x+x+y == d+x で共通しているだけどその次の移動での増加量が x の値にのみ依存するのでx を増加させることで所持金を変化させたタクシーの方が分が悪い

 ステップ3

2つのタクシーの運賃を普通の経済感覚で比べてみるとどの場合でも所持金が1円減るだけの赤色のタクシーを利用できるときは利用して損をすることがないことがわかるたぶん01BFS みたいなステップを踏めば解けるような気がするな

 提出 #28854159 (AC / 1242 Byte / 2410 ms)

頭の中が整理されていないので無駄がまだあると思う(嘘解法の可能性も大いにある)でも1秒しかなかった JOIG-2021-F「デジタルア(Digital Art)(20211210p01) と違って制限時間が4秒もあったので間に合った嬉しい

D 問題まではやるだけだったけどEエゴイ展 (EGOI Exhibition)がまだ解けていない価値の正負と絵の種類で場合分けとクラス分けをして DP をしようとしたんだけど……


PQ#dn_heap がバグってるね不等号の向きが逆これは要するにPQ には繰り返す幅優先探索の無駄を気休め程度に取り除く意味しかなく実際にはその効果さえなかったということ

 提出 #28975251 (AC / 502 Byte / 1158 ms)2410 ms

PQ#dn_heap のバグをとったとしても定数倍が重いせいで初期パラメータが異なる複数の地点をスタト地点に設定した幅優先探索のようなものを距離の更新がなくなるまでぐるぐる回した方が速い優先度付きキーを使うと確かに最短距離を複数回更新するという無駄はないのだけど

Array をキーにするのと Hash をキーにするのでは Hash の定数倍が重いー内で要素が重複することを気にせず Array につっこんだ方が速かったりする

そんな(良くない)理由でメインループ内の前半のループのキーは PQ でも(後半のループのよう) Hash でもなく Array になっている

 提出 #28988344 (AC / 600 Byte / 863 ms)1158 ms

ーを2本持つことでプライオリーを使わないでもソト済みの状態を保ちながらキーを伸ばせる場合があるというのはAtCoder について書いた2番目の日記に書いてある>20190916p01.01今回もこれが使える

863 ms というのは Ruby に限らない AC の中で1ページ目に入っているのだ(全部で9ページではあるのだけど)