P1742 最小圓覆蓋

2022-07-20 04:30:16 字數 1349 閱讀 8793

給出n個點,讓你畫乙個最小的包含所有點的圓。

先給出點的個數n,2<=n<=100000,再給出座標xi,yi.(-10000.0<=xi,yi<=10000.0)

輸出圓的半徑,及圓心的座標,保留10位小數

6

8.0 9.0

4.0 7.5

1.0 2.0

5.1 8.7

9.0 2.0

4.5 1.0

5.0000000000

5.0000000000 5.0000000000

none

隨機增量法

前置知識,三點定圓

設圓上有三個點\(a(x_1, y_1), b(x_2, y_2), c(x_3, y_3)\)

我們可以找這些點的連線的任兩條線,找它們垂直平分線的交點就是圓心

易得向量(線段)ab,bc

設兩條線段的垂直平分線為\(a_1x+b_1y=c_1,a_2x+b_2y=c_2\)

上式的a和b分別是兩個向量的x和y(法向量(可以帶入驗證))

之後帶入ab,bc的中點來求出兩個c

聯立兩個垂直平分線,解出來

\(x=\frac, y=\frac\)

有了圓心,半徑自然好求,隨便找圓上一點(a,b,c)與圓心求距離就是半徑了

隨機增量

初始設定第乙個點為圓心,半徑為0

依次掃每個點,如果不在當前圓內,則以那個點為圓心

再次掃從頭開始到當前的每個點,如果不在當前圓中

則當前點與那個點作為新圓直徑,構成當前圓,再次掃到當前每個點

如果仍有不在圓內的,三點定圓

#include #define _ 0

#define ll long long

inline ll in()

const int maxn = 1e5 + 10;

const double eps = 1e-14;

struct node

double mod()

friend node operator - (const node &a, const node &b)

friend node operator + (const node &a, const node &b)

}e[maxn];

int n;

void circle(node a, node b, node c, node &o, double &r)

void work()

} printf("%.10f\n%.10f %.10f", r, o.x, o.y);

}int main()

洛谷P1742 最小圓覆蓋

給出n個點,讓你畫乙個最小的包含所有點的圓。輸入格式 先給出點的個數n,2 n 100000,再給出座標xi,yi.10000.0 xi,yi 10000.0 輸出格式 輸出圓的半徑,及圓心的座標,保留10位小數 輸入樣例 1 複製 6 8.0 9.0 4.0 7.5 1.0 2.0 5.1 8.7...

洛谷 P1742 最小圓覆蓋

給出n個點,讓你畫乙個最小的包含所有點的圓。這個問題實際上是找出三個點確定的乙個圓,能包含其他所有點。與三點共圓有密切的關係,先來說三點共圓。三點共圓有兩種情況 三個點共線或不共線,共線則兩個最遠點構成直徑,不共線則圓為三角形外接圓 重點考慮外接圓情形,班經用正弦定理是比較好找的,其實難度是找圓心,...

P1742 最小圓覆蓋(計算幾何)

體驗過 o n 3 過 10 5 嗎?快來體驗一波當 wys 的快感吧 qaq 設 begina1 x b1 y c1 a2 x b2 y c2 end 其中 a1,a2,b1,b2,c1,c2 為已知量 由 式得 x frac 帶入 式並化簡得 y frac 分子分母同時乘以 a2 得 y fra...