1
1

More than 1 year has passed since last update.

RECRUIT 日本橋ハーフマラソン 2023夏(AtCoder Heuristic Contest 022)265位 参加記

Posted at

RECRUIT 日本橋ハーフマラソン 2023夏(AtCoder Heuristic Contest 022)265位でした. 初めに思いついた解法を3つ紹介し, その後何を考察したか時間経過ごとに長々と書きます.
最後に黄perf以上取るために何がAHCに必要なのか考えました.

解法①

placementパート いい感じに設定します.
meassureパート
それぞれの入口iの周囲9マスに対し, それぞれ1回推定する. (m_P[i][0][0] ~ m_P[i][2][2])
入口i, 出口j とすると, sum[i][j] = pow(m_P[i][0][0] - P[Y[j] - 1][X[j] - 1], 2) + ... + pow(m_P[i][2][2] - P[Y[j] + 1][X[j] + 1], 2)を計算し,
sum[0][E[0]] + ... + sum[N-1][E[N-1]]が最小となるEを求める. (最小コストフロー問題に帰着できると思っています。(AtCoder Libraryのを使う))

解法②

placementパート 一点のみを1000にし, その他は0にする.
meassureパート
それぞれの出口jから1000までのdy, dxを保存する. (dy, dxのサイズはN)
入口iからdy, dxを推定していき, 1000となる確率が高いものを答えとする.

解法③

出口に8bitの2進数を設定します.この2進数は出口ごとに異なる.
n番目のフラグ(0<=n<=7)ごとにdy[n], dx[n]を設定する.
placementパート
出口jに1010000と設定すると, (Y[j] + dy[5], X[j] + dx[5])と(Y[j]+dy[7], X[i]+dx[7])のPをMax_P, その他はMin_Pとする. (Max_P, Min_Pは1000, 0などマップの最大値, 最小値).
meassureパート
すべての入口iはそれぞれのdy, dxをm_N回推定する. (m_Nは10000 / (N * 8)で12~20となる)
同じところをm_N回推定すると, その平均値の分布の標準偏差が S / sqrt(m_N) となりSが大きくても正解できるようになる.
m_N回推定後, そこがMin_PかMax_Pかを判定する. 出口にごとに異なる2進数を設定しているので, ここを正確に判定できると間違えは0になる.
ひどい解説なのでわからないところがあれば言ってください!

考察

・1,2日目
解法①を実装し結果を見るとS >= 400でボロボロだったので, 設定するPを0, 1000にする案を考え, 解法②が思いつきました.
・3日目
解法②を実装し結果を見ると, 推定回数がN * Nとなり0か1000を区別するのに, 1~2回しか推定できないため, (実装は10000回上限を忘れてた)不可能だと判断し, この解法を捨てました. 設定回数を削減しようと考え, 入口ごとにN回するのがダメそうななので, 8回(logN + 1)にすると, 0か1000を区別するのに, 12~20回推定できるため良さそう. こんな感じで解法③を思いついた.
・3~最終日
入口ごとにN回 → 8回が天才だと思いましたがダメでした. この解法はplacement_costが5 * 10^7とかになり, いくらwaが少なくても満点には届きません.
placement_costを少なくするため, 色々しましたが, placemnt_costを下げるとwaが多くなり, トレードオフだなと思い, 最終日までここに固執しました.
・終了後
1位の人などは解法②を採用してました. (https://twitter.com/Jiro_tech15/status/1693203060821225548)
僕のように解法③に固執していた人は同じような感想を持ってました. (https://twitter.com/through__TH__/status/1693206079679910082)

黄perf以上を狙うため何が大事か

まず長期(1~2週間)コンテストを振り返る
・AHC013 90位
 ・詳細な解法提案をせず, コンテスト中盤でパラメータを調整 (大まかな解法はあっている)
・AHC014 138位, AHC017 198位
 ・詳細な解法を思いつかなかった (大まかな解法はあっている)
・AHC016 102位, AHC018 153位
 ・詳細な解法提案に固執, 他の大まかな解法すら考えていない (大まかな解法が違う)
・ AHC022 265位
 ・詳細な解法提案に固執, 他の大まかな解法を知識不足で捨てる (大まかな解法が違う)
上3つに, はまらないようにしましたが, 新しいパターンで失敗しました. AHC017と同じ流れかと思っていた.
それぞれの大まかな解法A, B, Cがあって, それぞれに詳細な解法a, ,b cが存在する.
Aaである程度のスコアをとれるとAb, Acを思いつくように時間を割く.
思い直してBaを考えるがダメそう. ここでBb, Bcを思いつくように時間を割くと今回では正解する. でも, 上から2つにはまるかもしれない.
今回の問題でいうと,
問題観察力 : Sが重要そう, score関数よりmeassure_costとplacement_costが重要そう, 入口iが独立している(?)など
解法提案力 : 上を意識して解法を考える.
とすると, プログラミング能力, 問題観察力, 解法提案力がある程度あれば青perfはとれそうですが, Bを捨てる判断や,正解のAb, Acが存在するなど何かしらの嗅覚(?)なのか, 経験値や知識なのか未だに何が必要なのかわかってないです.
解法②は最初からうまくいったのか, 途中からうまくいったのか, 解法③は思いついたけど捨てたのか, 捨てる理由は何なのか知りたいです.
また, 長期AHCは月1で開催してほしいです!!

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1