題意:給你n個點,要求找到乙個點,和乙個圓心,使得有n/2向上取整個點在圓上,一定有滿足條件的點存在
題解:既然一定有解,而且圓上有n/2向上取整個點,那麼我們可以通過隨機來找三個點來確定乙個圓心,和半徑,可以看出這三個點在圓上的概率是很大的,注意要特判點數為1,2,3,4的情況
ps:一開始想的是隨機兩個點,後來發現這樣兩個點是直徑的概率太小了,而且有可能根本不存在直徑
#include#includeview code#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;
}/*******************
*******************
*/
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度,以使上面的刻紋與天相對應,才能開啟石門。但是,旋轉石盤需要...