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