LuoguP1742最小圓覆蓋 計算幾何

2021-08-20 15:39:12 字數 1767 閱讀 5983

一道模板題吧,wa了好久

開始以為是凸包+旋轉卡殼+等等結果才發現有錯。

果然模板不可以亂yy

正解:一看名字就知道,先要把輸入的點打亂,使其隨機化,作用就是降低複雜度,後面講。

然後就是從第乙個點開始列舉點

i i

,如果當前的列舉的點在圓內部,就繼續不用管,否者就以該點為圓心半徑為0開始列舉

i' role="presentation">i

i前面的點

j j

,如果前面的點在當前圓的外面就取點

i' role="presentation">ii和點

j j

的中點為圓心,距離的一半為半徑,以這個圓再列舉

j' role="presentation">j

j前面的點

k k

,然後如果點

k' role="presentation">k

k在圓外就以i,

j,k i,j

,k

三點組成的三角形的外切圓來更新當前的圓。

通過以上操作,因為每次都更新較大的圓,而且答案必定有兩個或以上的點在圓上(只有乙個點除外),所以保證了正確性,看似o(

n3) o(n

3)

其實只有僅僅o(

n)o (n

)其實還有一道幾乎應該就是一樣的題,p2533 [ahoi2012]訊號塔,這裡面的題解有證明。

下面直接上**

#include

#include

#include

#include

#define db double

const

int m=1e5+1;

using

namespace

std;

const db eps=1e-10;

db dcmp(db x)

int n;

struct point

void in()

}pp[m];

point operator +(point a,point b)

point operator -(point a,point b)

point operator *(point a,db b)

point operator /(point a,db b)

db cross(point a,point b)

db dot (point a,point b)

double dis(point a,point b)

point getmid(point a,point b)

point rotate(point a)

struct circle

circle(point a,db r):o(a),r(r){}

};struct ********//數學方法求外心

********(){}

********(point a,point b,point c):t1(a),t2(b),t3(c){}

};circle circlein(point t1,point t2,point t3)幾何方法求外心,三角形兩邊中垂線交點

void work()}}

}}

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

}int main()

fighting everyday!

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