概要
問題文 → ■, ■
公式解説 → なさそう?
自分の提出 → ■ など
JOI の output only の問題です。
Heuristic contest タイプの問題で、厳密解が得られなくともそこそこ良い解を出力することが要求されています。また、手元実行でよいため実行時間制限はあまり気にしないでよく、例えば数十分の実行時間を前提とすることもできます。
出力に対する評価方法は、当時参加者による相対評価です。全ケースで、当時参加者ベスト水準である
解法
山登り法
次の山登り法により、全問題の
- 適当な
個の町を選んで、初期状態とする。 - 選択中のランダムな町を外して、未選択のランダムな町を使ってみる。スコアが悪くならなかったら採用する
「election 1, 2, 3, 4」では初期状態
「election 5」のみ、
- 山登り法において、ある程度のステップ数改善が見られなければ、打ち切る。
- 新しい初期状態をランダムに作り、山登り法を再開する。
としました。
スコア更新の高速化
工夫なしに毎回スコアを計算しなおすと、山登り法の 1 試行に対して、
- 各町がいくつの円でおおわれているかのカウンタを持つ。
- 山登り法のステップでは、
つの円を消し、 つの円を書き込むことになる。これに合わせて合計 回、カウンタを増減させる。 - カウンタが
, の境界をまたぐときにのみ、スコアの増減が生じる。
結果
どのケースも、手元計算時間
- [election1] 78100
- [election2] 32203804
- [election3] 50522701
- [election4] 49860631
- [election5] 42626365
コメント
Heuristic contest は本当に初心者で、初めて山登り法を実装しきった感じでしたが、ちゃんとスコアが出てくれてよかったです。
おそらく古い問題ということで、参加者にとってもノウハウの蓄積が少ない時代だったと思うので、