ベスパリブ

プログラミングを主とした日記・備忘録です。ベスパ持ってないです。

第10回 Asprova プログラミングコンテスト(AtCoder Heuristic Contest 023)参加記録

概要

第10回 Asprova プログラミングコンテスト(AtCoder Heuristic Contest 023) の参加記録です。

貪欲解

まずグリッドをBFSしてグラフを得ました。

BFSしてグラフを得る

上か下かのDAGを得られる。下を採用した。

グラフはDAGになるので、「奥から優先して作物を植える」「植える作物はscore = d-s+1 が大きいものから順に植える」という貪欲をしました。

得点は18,935,125。正の得点が得られたので良しとする。

atcoder.jp

ビームサーチ解

多様性を持たせるため「1ターンに植える作物の最大個数」「植える作物のscoreの上限値」を変数にして、ビーム幅2とビーム深さ3にしてビームサーチしました。

サンプルファイル000.txtのGIF

得点は21,194,750。

atcoder.jp

これが最終的な提出になりました。

反省点

ビジュアライザを試したらわかるのですが、「1ターンに植える作物の最大個数」を設定しても、1ターン目ですべての区画に作物がほぼほぼ埋まってるので、2ターン目、3ターン目もほぼほぼ埋まっています。なので多様性は確保できず、よくないビームサーチになっていました。

改善点としては、ビームで深さに潜るときに「1ターン進める」ではなくて、「なにか収穫できるまで状態を進める」くらいまですれば状態は変化して多様性は確保できたのかなと思いました。

手元では5000msくらいかかっていても、システムに提出すると時間が1000msだったりするのでそのへん勘所がよくわからなかった。

あと私のビームサーチは遅すぎる。ビットボードや参照カウント方式などの高速化テクをもっと試すべき。

最終的なシステムテストの結果

システムテストの得点:839,674,300

516位

atcoder.jp

強い人の解法

どうやらグラフの奥まで自由に歩ける「通路」を作ったほうが良いらしい。

やってることわかりやすい。

やはり「通路(道)」と「部屋(葉)」に分けるのが強そう。部屋に何を植えるかは山登りがいけるという方針?

たしかに私のような「通路」を作らない方針だと多様性の確保ができなくてうまくビームできなかったんですよね。逆に言えば「どうすれば多様性が生まれるか」を考えたときに「部屋を作って部屋ごとに多様な状態を作る」というのは思いついてほしかった(自分に)。

焼きなましもいけるらしい。全然わからない。焼けるとは思えず完全にビームサーチしか頭になかったです。

感想

AHC、最初は「楽しみ~」→読解中&貪欲実装中「めんどくさい~」→貪欲後「楽しい~」 という感じでした