hdu6242 計算幾何

2022-03-15 23:36:52 字數 1785 閱讀 2120

題意:給你n個點,要求找到乙個點,和乙個圓心,使得有n/2向上取整個點在圓上,一定有滿足條件的點存在

題解:既然一定有解,而且圓上有n/2向上取整個點,那麼我們可以通過隨機來找三個點來確定乙個圓心,和半徑,可以看出這三個點在圓上的概率是很大的,注意要特判點數為1,2,3,4的情況

ps:一開始想的是隨機兩個點,後來發現這樣兩個點是直徑的概率太小了,而且有可能根本不存在直徑

#include#include

#define fi first

#define se second

#define mp make_pair

#define pb push_back

#define pii pair#define c 0.5772156649

#define pi acos(-1.0)

#define ll long long

#define mod 1000000007

#define ls l,m,rt<<1

#define rs m+1,r,rt<<1|1

using

namespace

std;

using

namespace

__gnu_cxx;

const

double g=10.0,eps=1e-8

;const

int n=100000+10,maxn=400000+10,inf=0x3f3f3f

;inline

bool zero(double

a)struct

point;

point(

double _x,double

_y)

}p[n];

intn;

double

r;double

dis(point p1,point p2)

double

line(point p1,point p2,point p3)

bool

ok(point p0)

}if(n&1)return ans>=(n/2+1

);

else

return ans>=(n/2);}

point getmid(point p1,point p2,point p3)

;

double a1=(p2.x-p1.x),b1=(p2.y-p1.y),c1=-pm.y*(p2.y-p1.y)-pm.x*(p2.x-p1.x);

pm=;

double a2=(p3.x-p1.x),b2=(p3.y-p1.y),c2=-pm.y*(p3.y-p1.y)-pm.x*(p3.x-p1.x);

pm=;

r=dis(pm,p1);

return

pm;}

intmain()

; printf(

"%.10f %.10f %.10f\n

",p0.x,p0.y,dis(p0,p[0

]));

}else

if(n==2||n==3||n==4

) ;

printf(

"%.10f %.10f %.10f\n

",p0.x,p0.y,dis(p0,p[0

]));

}else}}

}return0;

}/*******************

*******************

*/

view code

hdu 6242 隨機化計算幾何

題意 給你1e5個點,讓你輸出乙個圓,滿足至少n 2個點在圓上。思路 因為至少有n 2個點在圓上,我們可以隨機三個點。那麼這三個點外接圓滿足條件的概率至少為1 2 1 2 1 2 1 8,那麼多隨機幾次就好了。注意特判n小於等於4的情況。include using namespace std str...

hdu 3629 計算幾何

這道題想了很久都沒想出來什麼高效一點的方法,所以就在網上膜拜了大牛的思路。主要思想就是去掉點對之間的凸包,因為凸包一定是乙個三角形中包含乙個點,那我們就可以對於每個點判斷有多少個三角形能把它包含在內 判斷可以用逆向思維,就是所有三角形的個數減去有多少個三角形不能把它包含在內,然後通過極角排序來求出不...

HDU 4823(計算幾何)

魔法師百小度也有遇到難題的時候 現在,百小度正在乙個古老的石門面前,石門上有一段古老的魔法文字,讀懂這種魔法文字需要耗費大量的能量和大量的腦力。過了許久,百小度終於讀懂魔法文字的含義 石門裡面有乙個石盤,魔法師需要通過魔法將這個石盤旋轉x度,以使上面的刻紋與天相對應,才能開啟石門。但是,旋轉石盤需要...