以下の内容はhttps://kaede2020.hatenablog.com/entry/2024/11/11/222634より取得しました。


THIRD プログラミングコンテスト2024(AtCoder Heuristic Contest 039)参加記

0.はじめに

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

今回は、 THIRD プログラミングコンテスト2024(AtCoder Heuristic Contest 039)に参加しました。開催期間は2024年11月11日(日)15:00から19:00までの4時間の短期コンテストでした。

この参加記はコンテスト後に書いています。今回は、4時間集中が切れることなく、参加記を書く時間も惜しんで、最後まで取り組んでいました。

何もメモしていなかったので簡単なものになりますが、少しでも記録に残しておきたいと思いこれを書いています。これを読んだ方の参考になる点が少しでもあると良いのですが。そして、ヒューリスティック・コンテストに興味を持つ人がもっと増えることを願っています。

1.問題文の概要

atcoder.jp

二次元平面上にいるサバとイワシそれぞれ5000匹ずつ(計10,000匹)の座標が与えられるので、条件を満たす多角形を構築し、その多角形の内側に含まれるサバの数からイワシの数を引いた差を最大化します。

条件:

  • 多角形の頂点数は4以上1000以下。
  • 辺の総和の長さは400000以下。
  • 各頂点の座標は整数で、0 ≤ x, y ≤ 100000を満たす。
  • 辺はx軸またはy軸に平行。
  • 多角形は自己交差しない。

出力形式:

  • 最初に頂点数 m(4 ≤ m≤ 1000) を出力。
  • 次に、各頂点の座標をm行で出力。

得点:

  • 多角形の内側に含まれるサバの総数を aaイワシの総数を bとすると、得点は max(0, a - b+1)\text{max}(0, a - b + 1)となる。
2.最初の提出

最初の提出は開始20分後、(0, 0), (0, 100000), (100000, 100000), (100000, 0)の4点をつなぐ多角形を書きました。スコアは150点になりました。

150点

seed0のビジュアライザ スコア1
3.2回目の提出

四角形の大きさを四分の一にしました。(50000, 50000), (50000, 100000), (100000, 100000), (100000, 50000)の4点をつなぐ多角形を書きました。

提出をすると42763点になりました。

25分が経過していました。

42763点

seed0のビジュアライザ スコア514
4.長方形を乱択山登りする

対角線上の2点をランダムで選択すると長方形が決定します。長方形の長さが400000以下のときにスコアを計算して、山登りをします。提出すると282385点になりました。

30分が経過していました。

あまり良く覚えていないのですが、思った以上に順位がよかったです。

282385点

seed0のビジュアライザ スコア1478
5.長方形から長方形を引いてコの字の多角形にする

長方形から長方形を削除します。方法としては、長方形の内部から辺に平行な2点を選び、辺に向かって垂線を引きます。

48分が経過していました。

提出をすると301169点になりました。順位が良くて、おおっと驚きました。一桁順位だったと思います。

301169点

seed0のビジュアライザ スコア1892
6.長方形からたくさん長方形を引いた多角形にする

長方形を追加するコードも書きますが、うまくいきません。長方形を追加したり削除したりすることを思い描いていましたが、複数の長方形を削除する方向に絞ることにしました。

それでも、とにかくバグらせます。長方形にならない!

何度も見た長方形でない多角形のビジュアライザ

何とかデバッグを書き終えたときには2時間31分が経過していました。提出をすると319679点でした。がんばった割に点数が上がらず、残念に思います。

319679点

seed0のビジュアライザ スコア2263
7.長方形の角をけずる

ここからどうしようと悩みます。一番大きな長方形の選択方法をスコアではなくサバの数で山登りしてみることにしました。しかし、あまり良くなりません。

その後、下図のような、角をけずるような方法を取り入れました。外周の長さが変わらないのが良い点です。

左と右は外周の長さが同じ

提出をすると395864点になりました。

上がったー!

しかし、すでに3時間12分が経過していました。残りは48分です。何とか40万点までがんばりたい。

395864点

seed0のビジュアライザ スコア2293
8.WAが続く

しかし、なかなか改善できません。最初の長方形の選択時のスコアの計算方法を2乗の差にすることにします。100テストケースの結果、ついに40万を超えました。提出をします。

100テストケースの結果

しかし、結果は1ケースでWAが出て0点でした。

149AC 1WA

100テストケースでは問題ないため、どうしてWAが出るのがわかりません。もう1度提出してみたらどうだろうか、とか、少し変えたりして提出してみますが、6連続WAが出ます。ついに残された時間は最後の提出を残すのみとなってしまいました。

6連続WAが続く
9.最後の提出

最後の提出はこれまでACしていたもののパラメータを変えたものにしました。これが今日の最高得点となる396572が出たものの、40万には届きませんでした。

396572点

seed0のビジュアライザ スコア2620

試行中でいちばんよかったseed84のビジュアライザではスコア4259が出ていました。

seed84のビジュアライザ スコア4259
10.最終結

そしてあっという間に4時間のコンテストが終了しました。結果は751人中81位。初の黄パフォ、2桁順位を達成しました。

もうちょっとがんばれなかっただろうかと思いはするものの、良い結果が出てうれしく思います。

396572点 751人中81位

ヒューリスティックのRatingは58上がり、1759になりました。

Ratingは1759に上がりました

明後日2024年11月13日水曜日にはAHCラジオがあります。しっかり復習したいと思います。

www.youtube.com

11.終わりに

思っていた以上に良い結果が出て、長く続けているとこんな風にごほうびをもらえることもあるのだなあと思いました。今回は実装する際にChatGPTを使ったのも時間短縮に役立ったと思います。具体的な実装を日本語で指示してコードを書いてもらいました。

もっと上を目指したいという気持ちはまだまだ尽きることはありません。これからもがんばっていきたいと思います。

12.おまけ(WAの原因)

今朝起きて(コンテストの2日後)はっと気がつきました。頂点数mが1000以下という制約をつけていませんでした(そんなに頂点数が多くなるケースは無いと思っていました)。WAが出ていたソースコードに出力のmが1000以下という条件をつけて再提出します。

無事AC

無事ACしました。しかし40万を超えていません。

あれ?

「これがACすれば40万を超えていたはず」という思いは崩れ去ったのでした。今思うと、もっと複数のテストケースを試すとか方法はいろいろとあったはずです。短期コンテストで残り時間が少なくなると、焦ってしまうのだなあと思いました。




以上の内容はhttps://kaede2020.hatenablog.com/entry/2024/11/11/222634より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14