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;
		}
	}
}