QOJ.ac

QOJ

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

#15628. Common Tangent Lines

Statistics

众所周知,平面上的两个圆如果不相交且不相切(即分离),则它们有四条不同的公切线。

给定 $xy$ 平面上的四条直线。你的目标是对这些直线进行平行移动,使得它们成为某一对半径为正的分离圆的四条不同公切线。你希望以尽可能小的代价完成此操作,代价定义为移动距离之和。直线的移动距离是指移动前后两条直线之间的距离。

每条直线由两个参数 $a$ 和 $d$ 指定,定义为: $$x \cos\left(\frac{\pi a}{180}\right) + y \sin\left(\frac{\pi a}{180}\right) = d.$$

例如,$(a, d) = (60, 1)$ 的直线表示 $x/2 + \sqrt{3}y/2 = 1$,因为 $\cos(\pi/3) = 1/2$ 且 $\sin(\pi/3) = \sqrt{3}/2$。

首先,判断该目标是否可实现。如果可以,确定所需的最小代价,定义如下:满足目标可实现的最小代价 $c$,即对于任意正实数 $\varepsilon$,目标均可在代价至多为 $c + \varepsilon$ 的情况下实现。目标本身不需要在代价恰好等于 $c$ 时实现。

输入格式

输入包含一个或多个测试用例。输入的第一行包含一个整数 $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$ 条直线的参数 ($0 \le a_i < 180$, $-1000 \le d_i \le 1000$)。在移动前,两条或多条直线可能相同。

输出格式

对于每个测试用例,如果目标不可实现,输出 no。否则,输出上述定义的最小代价。输出的绝对误差或相对误差必须小于或等于 $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 的第一个测试用例中,你必须移动前两条相同直线中的至少一条(图 L.1 (a))。对于 $\varepsilon > 0$,将一条直线沿 $y$ 轴正方向移动 $\varepsilon/2$,另一条沿 $y$ 轴负方向移动 $\varepsilon/2$,即可以 $\varepsilon$ 的代价实现目标。这会产生半径为 $\varepsilon/2$ 的圆的四条切线(图 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.