码迷,mamicode.com
首页 > 其他好文 > 详细

Codeforces Beta Round #1 C. Ancient Berland Circus

时间:2014-06-05 01:10:27      阅读:300      评论:0      收藏:0      [点我收藏+]

标签:codeforces   刷题   计算几何   

果然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();
	}
}



Codeforces Beta Round #1 C. Ancient Berland Circus,布布扣,bubuko.com

Codeforces Beta Round #1 C. Ancient Berland Circus

标签:codeforces   刷题   计算几何   

原文地址:http://blog.csdn.net/lin375691011/article/details/27229515

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!