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

2022-05-19 20:26:25 字數 2022 閱讀 4823

體驗過\(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=\frac

\]同理可得(把\(a,b\)互換即可):

\[x=\frac

\]給出三個點,求出圓心&半徑

\[\beginx1^2-2x1*x0+x0^2+y1^2-2y1*y0+y0^2=r^2\\x2^2-2x2*x0+x0^2+y2^2-2y2*y0+y0^2=r^2\\x3^2-2x3*x0+x0^2+y3^2-2y3*y0+y0^2=r^2\end

\]\(②-①\)和\(③-①\),並化簡得:

\[\begin2*(x2-x1)x+2*(y2-y1)y=x2^2-x1^2+y2^2-y1^2\\2*(x3-x1)x+2*(y3-y1)y=x3^2-x1^2+y3^2-y1^2\end

\]我們將三點定圓的柿子對應二元一次方程組中,可知:

\[a1=x2-x1,\quad a2=x3-x1

\]\[b1=y2-y1,\quad b2=y3-y1

\]\[c1=\frac,\quad c2=\frac

\]然後就可以根據三個點求出圓心和半徑了

跟據前置芝士,我們知道對於任意三個不共線的點,我們可以求出三點定的圓,所以乙個明顯的想法就是列舉三個點

我們先列舉第乙個點,有兩種情況

①:當前點在當前外面,即\(dis(\)圓心,該點\()>r\)那麼我們不管這個點

②:不是情況①的情況,那麼我們就需要重新構造這個圓來包含所有的點了

怎麼構造呢?我們重新列舉兩外兩個已經遍歷過的點,組成三個點。同理,若重新構造的圓包括了三個點,那麼就不管,若有任意乙個在圓外,那麼我們根據前置芝士重新確定圓心和半徑即可

ps:本題出題人過於duliu,故意構造資料卡掉了上述解法,所以我們需要乙個神奇的東西:隨\((da)\)機\((luan)\)增\((shu)\)量\((ju)\)法,來防止掉精度

**如下:

#includeusing namespace std;

#define il inline

#define re register

#define d double

il int read()

while(c >= '0' && c <= '9') x = x * 10 + c - 48, c = getchar();

return x * f;

}#define rep(i, s, t) for(re int i = s; i <= t; ++ i)

#define eps 1e-12

#define maxn 100005

#define ff(x) (x) * (x)

int n, m;

d r;

struct node

o, e[maxn];

il d dis(node a, node b)

il void get(node a, node b, node c)

; r = dis(a, o);

}il void work()

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

int main()

n = read();

rep(i, 1, n) scanf("%lf%lf", &e[i].x, &e[i].y);

random_shuffle(e + 1, e + n + 1);

work();

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

return 0;

}

P1742 最小圓覆蓋

給出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.05.00...

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