首页 > 代码库 > 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(); } }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。