Codeforces Beta Round #1--C题(多边形求最小面积)

题目: http://codeforces.com/contest/1/problem/C

 

题意:给你一个正凸多边形的三个点,然后求出这个正凸多边形的面积的最小值。

方法是这样的:以这三个点做一个三角形,求出这个三角形的外心(外接圆的圆心),这个点也就是外接多边形的中心

然后找出内角所对应的边数的GCD

当然,内角所对应的边数不一定是整数,我们需要用double的GCD和LCM进行计算,求出最小边数。

#include <stdio.h>
#include <math.h>
const double eps=1e-4;
const double PI=acos(-1.0);

double gcd(double x,double y)
{
    return y>eps? gcd(y,x-floor(x/y)*y):x;
}

double bcos(double a,double b,double c)
{
     return acos((a*a+b*b-c*c)/(2*a*b));
}
int main()
{
    double ax,ay,bx,by,cx,cy;
    scanf("%lf%lf%lf%lf%lf%lf",&ax,&ay,&bx,&by,&cx,&cy);
    double a=sqrt((ax-bx)*(ax-bx)+(ay-by)*(ay-by));
    double b=sqrt((ax-cx)*(ax-cx)+(ay-cy)*(ay-cy));
    double c=sqrt((bx-cx)*(bx-cx)+(by-cy)*(by-cy));
    double p=(a+b+c)/2;
    double s=sqrt(p*(p-a)*(p-b)*(p-c));
    double R=(a*b*c)/(4*s);
    double A=bcos(b,c,a);
    double B=bcos(a,c,b);
    double C=bcos(a,b,c);
    double n=PI/gcd(A,gcd(B,C));
    printf("%.11lf\n",R*R*sin(2*PI/n)*n/2);
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值