この記事で使うアルゴリズム
全探索
はじめに
カテゴリー競プロ初中級者100問では、Qiita
にて@e869120
さんがレッドコーダーが教える、競プロ・AtCoder上達のガイドライン【中級編:目指せ水色コーダー!】としてまとめられている100問をPython
で解いています。
全問題の一覧はこちらです
問題
https://atcoder.jp/contests/joi2007ho/tasks/joi2007ho_c
https://www.ioi-jp.org/joi/2006/2007-ho-prob_and_sol/2007-ho.pdf#page=5
この問題は全探索を用いて解くことができます。
方針
愚直な全探索はO(n^4)
となり間に合いません。
そこで2点p1,p2
を考え、時計回りに正方形を作ります。この時、残りの2つの点p3,p4
は一意に定まります。
つまり、全ての2点の組み合わせp1,p2
に対して、p3,p4
が存在するかどうかを調べれば良いです。
存在の確認をハッシュテーブルなどでO(1)
で実現できれば、問題を計算量O(n^2)
で解くことができます。
Python
の場合、set
やdict
はハッシュテーブルで実装されています。
あらかじめ点の組み合わせをソートしておくことで、2点の順列
ではなく2点の組み合わせ
を考えれば良くなり、2倍高速になります。
三平方の定理を使うことで、正方形の面積は(x1-x2)**2+(y1-y2)**2
で表せることがわかります。
コード
1 | from itertools import combinations |
記事情報
- 投稿日:2020年5月7日
- 最終更新日:2020年5月8日