bzoj1336 1337 最小圓覆蓋

2021-07-11 11:51:57 字數 1317 閱讀 4686

time limit: 1 sec  

memory limit: 162 mbsec  

special judge

submit: 1473  

solved: 648 [

submit][

status][

discuss]

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

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

輸出圓的半徑,及圓心的座標

68.0 9.0

4.0 7.5

1.0 2.0

5.1 8.7

9.0 2.0

4.5 1.0

5.00

5.00 5.00

經典模型,隨機增量法求最小圓覆蓋。

假如已經求出了前i-1個點的最小圓覆蓋,假如第i個點後,如果不在所求的圓內,那麼這個點一定在新圓的邊界上。這樣我們只要列舉另外兩個點就可以了,因為三點確定乙個圓。

列舉方法為:從1-(i-1)列舉乙個不在圓內的點j,再從1-(j-1)列舉乙個不在圓內的點k,那麼i j k三點就可以確定乙個圓。(注意三點共線的特殊情況)

這樣的列舉方法一定可以保證列舉到所有的點對,從而保證所有點在圓內且圓最小。(傻傻的我想這個想了好久……)

這樣的列舉複雜度看似是o(n^3),但在順序隨機的情況下可以證明複雜度是o(n)。

#include#include#include#include#include#include#define f(i,j,n) for(int i=j;i<=n;i++)

#define d(i,j,n) for(int i=j;i>=n;i--)

#define ll long long

#define maxn 100005

#define eps 1e-8

using namespace std;

int n;

double r;

struct p

;} friend p operator -(p a,p b);}

friend p operator /(p a,double b);}

}p[maxn],t;

inline double dis(p a,p b)

inline p rev(p a);}

inline p centre(p a,p b,p c)

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

return 0;

}

bzoj1337 最小圓覆蓋

給出平面上n個點,n 10 5.請求出乙個半徑最小的圓覆蓋住所有的點 新東西當然是要資瓷的,計算幾何都不太記得了,何況是這麼神奇的演算法 顯然乙個最優的圓一定過至少兩點,那麼我們預設1作為初始圓心。每次加入第i個點的時候如果不能覆蓋全部說明第i個點一定在圓上,返回去列舉另乙個點做乙個新的圓重新判斷 ...

最小圓覆蓋

最小圓覆蓋。神奇的隨機演算法。當點以隨機的順序加入時期望複雜度是線性的。algorithm a 令ci表示為前i個點的最小覆蓋圓。當加入新點pi時如果pi不在ci 1裡那麼pi必定在ci的邊界上。b 再從新考慮這樣乙個問題,ci為前i個點最小覆蓋圓且p在ci的的邊界上!同理加入新點pi時如果p i不...

最小圓覆蓋

最小圓覆蓋問題 在乙個平面上,給出 n 個點,求包圍這些點的最小圓,輸出圓心及半徑。分析雖然可以用模擬退火或者三分套三分,這裡只講隨機增量法,隨機增量法是一種確定性演算法,隨機意義下均攤複雜度 o n 而且可以達到很高的精度 可達到 10 10 量級 有事實 如果點 p 不在集合 s 的最小圓覆蓋內...