Codeforces 1 C. Ancient Berland Circus
問題
与えられた3つの点を頂点として持つような正多角形で、面積最小のものを求めよ。
制約条件
座標の絶対値≦1000
正多角形の角は100個以下
方針
正多角形の中心は(三点の外心)わかるので、そこから逆に、
d角形であることを決めうちして、それが正しいかを確かめる。
d≦100であることが保証されているので、d≦100について調べればよい。
ソースコード
spagetthi sourceの幾何のライブラリを使用。
EPS=1e-6としたらWAで、
EPS=1e-5にしたら通った。
void run() { P p[3]; rep(i,3)cin>>p[i].real()>>p[i].imag(); P m1=(p[1]+p[0])*0.5, m2=(p[2]+p[0])*0.5; P d1=p[1]-p[0], d2=p[2]-p[0]; P o=crosspoint(L(m1,m1+d1*P(0,1)),L(m2,m2+d2*P(0,1))); rep(i,3)p[i]-=o; for(int d=3;d<101;d++){ #define INT(x) (abs((int)((x)+EPS)-(x))<EPS) if(INT(abs(arg(p[1]/p[0]))*d/2/PI)&&INT(abs(arg(p[2]/p[0]))*d/2/PI)){ printf("%.9f\n",norm(p[0])*sin(2*PI/d)/2*d); break; } } }