首页 > 代码库 > Codeforces Beta Round #1 C. Ancient Berland Circus

Codeforces Beta Round #1 C. Ancient Berland Circus

果然Java还是不靠谱啊,一个NaN把我整了半天~~


题目大意:

有一个正多边形,给出任意三个顶点的坐标,求这个正多边形的最小面积。


解题思路:

首先要知道这三个顶点组成的三角形的外接圆一定是这个正多边形的外接圆。

用过计算出三角形的三边长,可以计算出三角型面积,进而推出外接圆半径。

可以得到三个圆心角,找出最大公约数,那就是最大角度。

就可以计算出多边形面积了~~



下面是代码:

import java.text.DecimalFormat;
import java.util.Scanner;
public class Main {
	public static double mod(double a,double b) {
		int i;
		for( i=0;(i+1)*b<=a;i++);
		return a-i*b;
	}
	public static double gcd(double a,double b) {
		if(b<0.0001&&b>-0.0001)return a;
		else return gcd(b, mod(a, b));
	}
	public static void main(String[] args)  {
		Scanner cin = new Scanner(System.in);
		double [] x = new double [3];
		double [] y = new double [3];
		for(int i=0;i<3;i++)
		{
			x[i]=cin.nextDouble();
			y[i]=cin.nextDouble();
		}
		double [] dis = new double [3];
		double p = 0;
		for(int i=0;i<3;i++)
		{
			dis[i]=Math.sqrt((x[i]-x[(i+1)%3])*(x[i]-x[(i+1)%3])+(y[i]-y[(i+1)%3])*(y[i]-y[(i+1)%3]));
			p+=dis[i];
		}
		p/=2;
		double s=Math.sqrt(p*(p-dis[0])*(p-dis[1])*(p-dis[2]));
		double r=dis[0]*dis[1]*dis[2]/(4*s);
		double ang1=Math.acos((r*r+r*r-dis[0]*dis[0])/(2*r*r));
		double ang2=Math.acos((r*r+r*r-dis[1]*dis[1])/(2*r*r));
		double ang3=Math.acos((r*r+r*r-dis[2]*dis[2])/(2*r*r));
		if(Double.isNaN(ang2))
		{
			ang2=2*Math.acos(-1.0)-ang3-ang1;
		}
		ang3=2*Math.acos(-1.0)-ang1-ang2;
		double ang=gcd(ang1, gcd(ang2, ang3));
		double ans=0.5*r*r*Math.sin(ang)*(2*Math.acos(-1.0)/ang);  
		DecimalFormat format = new DecimalFormat("#.00000000");
		System.out.println(format.format(ans));
		cin.close();
	}
}