QOJ.ac

QOJ

Time Limit: 2 s Memory Limit: 2048 MB Total points: 100

#15628. Common Tangent Lines

統計

平面上の2つの円が互いに素(重なりも接しもしない)であるとき、それらには4本の異なる共通接線が存在することがよく知られています。

$xy$平面上の4本の直線が与えられます。これらの直線に対して平行移動を行い、正の半径を持つ互いに素な2つの円の4本の共通接線となるようにすることが目的です。このとき、移動距離の総和として定義されるコストを最小化したいと考えています。直線の移動距離とは、移動前後の直線間の距離のことです。

各直線は2つのパラメータ $a$ と $d$ によって指定され、次の方程式で定義されます。 $$x \cos\left(\frac{\pi a}{180}\right) + y \sin\left(\frac{\pi a}{180}\right) = d$$

例えば、$(a, d) = (60, 1)$ の直線は、$\cos(\pi/3) = 1/2$ および $\sin(\pi/3) = \sqrt{3}/2$ であるため、$x/2 + \sqrt{3}y/2 = 1$ を表します。

まず、この目的が達成可能かどうかを判定してください。達成可能な場合、最小の必要コストを求めてください。ここで最小の必要コストとは、任意の正の実数 $\varepsilon$ に対してコスト $c + \varepsilon$ 以下で目的が達成可能となるような最小の値 $c$ として定義されます。目的は、コストが正確に $c$ となる必要はありません。

入力

入力には1つ以上のテストケースが含まれます。入力の最初の行には、テストケースの数を示す整数 $t$ ($1 \le t \le 1000$) が含まれます。続いて $t$ 個のテストケースが以下の形式で記述されます。

$a_1 \ d_1$ $\vdots$ $a_4 \ d_4$

$i = 1, \dots, 4$ について、$a_i$ と $d_i$ は $i$ 番目の直線を指定する2つの整数です ($0 \le a_i < 180$, $-1000 \le d_i \le 1000$)。移動前には2本以上の直線が同一である場合もあります。

出力

各テストケースについて、目的が達成不可能な場合は no と出力してください。達成可能な場合は、前述の最小の必要コストを1行に出力してください。出力の絶対誤差または相対誤差は $10^{-7}$ 以下でなければなりません。

入出力例

入力 1

4
90 0
90 0
45 0
135 0
0 -200
0 100
30 0
150 0
120 100
120 75
30 50
30 -100
178 -132
144 -83
165 199
19 31

出力 1

0
86.602540378444
no
173.814220263386

注記

サンプル入力1の最初のテストケースでは、最初の2本の同一な直線のうち少なくとも一方を移動させる必要があります(図L.1 (a))。$\varepsilon > 0$ に対して、一方の直線を $y$ 軸正方向に $\varepsilon/2$、もう一方を $y$ 軸負方向に $\varepsilon/2$ だけ平行移動させると、コスト $\varepsilon$ で目的が達成されます。これは半径 $\varepsilon/2$ の円に対する4本の接線となります(図L.1 (b))。$\varepsilon$ は任意に小さくできるため、最小の必要コストは 0 です。残りのケースは図L.1 (c) から (e) に示されています。

図L.1. サンプル入力1の図解

Discussions

About Discussions

The discussion section is only for posting: General Discussions (problem-solving strategies, alternative approaches), and Off-topic conversations.

This is NOT for reporting issues! If you want to report bugs or errors, please use the Issues section below.

Open Discussions 0
No discussions in this category.

Issues

About Issues

If you find any issues with the problem (statement, scoring, time/memory limits, test cases, etc.), you may submit an issue here. A problem moderator will review your issue.

Guidelines:

  1. This is not a place to publish discussions, editorials, or requests to debug your code. Issues are only visible to you and problem moderators.
  2. Do not submit duplicated issues.
  3. Issues must be filed in English or Chinese only.
Active Issues 0
No issues in this category.
Closed/Resolved Issues 0
No issues in this category.