競プロ始めました-kaede2020-

競技プログラミング初心者向けのブログです

第11回 Asprova プログラミングコンテスト(AtCoder Heuristic Contest 037)参加メモ

0.はじめに

はじめまして、もしくはお久しぶりです。競プロ歴4年8か月のかえでです。

今回は、 第11回 Asprova プログラミングコンテストAtCoder Heuristic Contest 037)に参加しました。2024年9月15日(日)19:00から23:00までの4時間、短期コンテストです。4時間というのは長く見えてあっという間に終わってしまいます。

長期に比べて短期は苦手意識が強いのですが、今日は4時間を少しでも上手に使って順位を上げることができればと思います。きちんと書けないかもしれませんがメモをしながら考察を進めていきたいと思います。これを読んだ方にコンテストの雰囲気をわかってもらえれば、うれしく思います。

1.問題文

atcoder.jp

  • ベースとなる飲料水にシロップと炭酸を加えて炭酸飲料を作る。
  • 飲料は (甘さ x, 炭酸 y) で表記されます。
  • 最初に持っている飲料は (0, 0) だけで、以下の操作を繰り返して目的の炭酸飲料を作る
    • 既に持っている飲料 (x, y) を選ぶ。
    • 新しい甘さと炭酸 (x', y') を選ぶ。ただし、x' ≥ x かつ y' ≥ y。
    • (x, y) を二つに分け、一方にシロップと炭酸を追加して (x', y') を作る。
    • 操作のコストは (x' - x) + (y' - y)。
  • 与えられた N 種類の炭酸飲料 (A_i, B_i) を全て作り、コストの総和を最小化する。
2.ビジュアライザ

「例を見る」のリンクをクリックしてビジュアライザを見ます。スタートは左下(0,0)から。全ての点を赤に変え終わると終了。遷移が青線。

seed0 「例を見る」Cost = 248233400325, Score = 4028205

例を見るのスコア予測 149,987,424

順位表を見るととにかく提出が早い。焦る気持ちを抑えます。

3.考察(アイデア出し)

何かよくわからない。青い線を短くする方法を考えれば良さそう。スタート位置からの距離が近い点を選ぶ。

貪欲法。今ある飲料から最小コストのものを探す。甘さと炭酸の値が小さい飲料からソートする。

スコアの予測 3,430,697,513

seed0 Cost = 43850900145, Score = 22803065
4.100テストケースの結果

100テストケースの結果。

100テストケースの結果
5.考察

グリッドみたいにやりたいなと思います。ビジュアライザを見るとバグってそうな何かができました。

seed0 Cost = 267595475266, Score = 3736741

格子点9か所を最初に追加してみます。スコアが悪化しました。

seed0 Cost = 52710598740, Score = 18970282

格子点9個の作り方を修正してみます。

格子点を先に作る

貪欲より悪くなりました。何か違う。

seed 0 Cost = 46510598740, Score = 21499076
6.最初の提出

最初の貪欲を提出します。

得点:3430697513

すでに1時間20分が過ぎました。提出は600人を超えていて、順位は170位でした。

170位/634人中
7.やることを考える

適当な答えをいくつか出力してみて、問題が少しわかってきました。ビジュアライザで言うならば、右上の方向にしか進めないということ。

  • x′ ≥x かつ y′ ≥y を満たす整数 x′ ,y′ を選ぶ

この制約がものすごく効いている感じです。ぱっと見、本当に貪欲が強い気がします。ちょっと上に3,605,538,738というスコアが並んでいる場所があるので、これも貪欲な気がします。何を変えれば良いのかな。

「例を見る」のリンクからビジュアライザを見ます。

そうか、無い頂点を足して中間地点を作っても良いのだったと思い出します。

  • ランダムな1点を加えて貪欲を行い、スコアが良くなれば採用する山登りを行います。

ループは1500回くらいしか回っていませんが、スコアは少し良くなっていそうです。うーん、なんか違いそう。短期は5分間隔で提出できるので、とりあえず提出します。その一方で100テストケースも試します。(追記:青い点が追加点なのでほぼ追加された点がありません)

seed 0 Cost = 43779354197, Score = 22840330

得点が少し上がり、3448215125になりました。

得点:3448215125

順位は249位でした。

249位/755人中

seed0のビジュアライザです。

seed0 ランダムな点を追加 Cost = 42603411197, Score = 23470771

得点は少し上がったものの、順位は312位に下がりました。

得点:3498227495    

312位/827人中

順位表を見ると、5,388,249,433というスコアが複数並んでいました。

これ、何だろう?

バグっていそうなスコア計算を修正しました。点が追加される数が多くなりました。seed0では114点追加されました。スコアも少し良くなりました。

seed0 Cost = 40960787610, Score = 24412004

提出をします。その間に100テストケースも試します。1ケースごとに2秒かかると100テストケースを試すのもちょっと時間がかかるなあと思います。その間にブログを書き進めます。うーん、トップは平均36,592,730というスコアで自分の約1.5倍。随分差があります。

提出した結果は363位でした。相対的に順位が下がっていきます。

363位/889人中

制限時間を10秒にしてみたらスコアが上がりました。

高速化したいと思います。…バグらせ続けたので別の方法を考えます。

出来上がりはグラフの木なので、部分木をつなぎ変えることを試します。

うまくいかなかったのでビジュアライザを見ます。

そうか。ランダムに追加する点を、例えば下の図のように2転換の距離が長い箇所を選び、その線分上の1点を選ぶようにします。

 

点を追加する場所

悪くない発想だと思ったのですが、思ったようにスコアが上がりません。

中点を追加 seed0 Cost = 41618268388, Score = 24026346

そしてそのままコンテストが終了しました。

8.最終結

985人中508位でした。

508位/985人中

レーティングは変わらず、1682でした。

レーティングは変わらず
9.終わりに

やはり、あっという間に4時間が終了してしまいました。

いろいろと気づき始めたのが遅すぎました。ビジュアライザをもっと見続けなければいけなかったなあと思います。

今なら追加したい点が思い浮かびます。例えば下の緑の点。これがあれば、もっと短くすることができそうです。

緑の点を追加したい

どうやればいいのかは試行錯誤中です。復習をしたいと思います。

2024年9月18日の午後8時からはAHCラジオがあります。ゲストにkozimaさんが来てくださります。皆さんもぜひご覧ください。

www.youtube.com