codeforces 1C-Ancient Berland Circus

题意

给定一个正多边形的三个顶点,求这个正多边形的最小面积

题解

确定多边形的任意三点组成的三角形的外接圆与多边形的外接圆相同,而正多边形的边数越多,越接近外接圆,面积越大,即问题转化问求多边形的最大边数,之后利用多边形公式即可求出。

  1. 已知三个点坐标x,y,z,并通过xyz三点优先计算其三条边a,b,c
  2. 通过海伦公式计算三角形的面积S
  3. 通过三角形外接圆与多边形外接圆相同可知,利用外接圆半径公式计算外接圆的半径R
  4. 已知边长abc,可求出对应角ABC的大小
  5. 此时需要求多边形的边数n,此时需要与已知信息进行联系,设n边形其中一边的圆心角为θ,即n=2π/θ,要使得n最大,则θ要最小
    1. 由于xyz均为正n边形上的一点且不连续,则abc对应的圆心角设为αθ,βθ,γθ,其中α,β,γ均为整数
    2. 圆周角定理:一条弧所对圆周角等于它所对圆心角的一半。可知θ=2π/n,即圆心角αθ=2A, βθ=2B, γθ=2C,要使得ABC均能整除θ,则θ为GCD(A,B,C)的倍数,由于θ最小,则θ为2xGCD(A,B,C),则n=π/θ
  6. 此时需要计算多边形的面积Area

知识点

  • 两点之间的距离公式
    ∣ A B ∣ = ( x 2 − x 1 ) 2 + ( y 2 − y 1 ) 2 |AB|=\sqrt{{(x_2 - x_1)}^2 + {(y_2 - y_1)}^2} AB=(x2x1)2+(y2y1)2

  • 海伦公式: p=(a+b+c)/2
    S = p ( p − a ) ( p − b ) ( p − c ) S=\sqrt { p(p-a)(p-b)(p-c) } S=p(pa)(pb)(pc)

  • 外接圆半径:
    R = a ∗ b ∗ c 4 ∗ S R=\frac {a*b*c} {4*S} R=4Sabc

  • 正多边形面积计算公式:
    A r e a = 1 2 n r 2 s i n φ Area=\frac12nr^2sin\varphi Area=21nr2sinφ

  • 浮点数取模:
    也可以使用代码中的方法

double gcd(double x, double y) {
    while (fabs(x) > eps && fabs(y) > eps) {
        if (x > y)  x -= floor(x / y) * y;
        else y -= floor(y / x) * x;
    }
    return x + y;
}
//eps = 1e-4

代码

#include <cstdio>
#include <cmath>
using namespace std;
#define eps 1e-4
#define Pi  acos(-1)

double gcd(double x,double y){
    return fabs(y)<1e-4?x:gcd(y,fmod(x,y));
}

double f(double ax,double ay,double bx,double by){
    return sqrt((ax-bx)*(ax-bx)+(ay-by)*(ay-by));
}
int main(){
    double x[3],y[3];
    for(int i=0;i<3;i++) scanf("%lf%lf",&x[i],&y[i]);
    double a=f(x[0],y[0],x[1],y[1]);
    double b=f(x[1],y[1],x[2],y[2]);
    double c=f(x[0],y[0],x[2],y[2]);
    double p=(a+b+c)/2.0;
    double s=sqrt(p*(p-a)*(p-b)*(p-c));
    double r=a*b*c/(s*4);
    double A=acos((b*b+c*c-a*a)/(2.0*b*c));
    double B=acos((c*c+a*a-b*b)/(2.0*a*c));
    double C=acos((a*a+b*b-c*c)/(2.0*a*b));
    double o=gcd(gcd(A,B),C);
    double n=Pi/o;
    printf("%.8lf\n",n/2.0*r*r*sin(2*Pi/n));
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SQLAlchemy 是一个 SQL 工具包和对象关系映射(ORM)库,用于 Python 编程语言。它提供了一个高级的 SQL 工具和对象关系映射工具,允许开发者以 Python 类和对象的形式操作数据库,而无需编写大量的 SQL 语句。SQLAlchemy 建立在 DBAPI 之上,支持多种数据库后端,如 SQLite, MySQL, PostgreSQL 等。 SQLAlchemy 的核心功能: 对象关系映射(ORM): SQLAlchemy 允许开发者使用 Python 类来表示数据库表,使用类的实例表示表中的行。 开发者可以定义类之间的关系(如一对多、多对多),SQLAlchemy 会自动处理这些关系在数据库中的映射。 通过 ORM,开发者可以像操作 Python 对象一样操作数据库,这大大简化了数据库操作的复杂性。 表达式语言: SQLAlchemy 提供了一个丰富的 SQL 表达式语言,允许开发者以 Python 表达式的方式编写复杂的 SQL 查询。 表达式语言提供了对 SQL 语句的灵活控制,同时保持了代码的可读性和可维护性。 数据库引擎和连接池: SQLAlchemy 支持多种数据库后端,并且为每种后端提供了对应的数据库引擎。 它还提供了连接池管理功能,以优化数据库连接的创建、使用和释放。 会话管理: SQLAlchemy 使用会话(Session)来管理对象的持久化状态。 会话提供了一个工作单元(unit of work)和身份映射(identity map)的概念,使得对象的状态管理和查询更加高效。 事件系统: SQLAlchemy 提供了一个事件系统,允许开发者在 ORM 的各个生命周期阶段插入自定义的钩子函数。 这使得开发者可以在对象加载、修改、删除等操作时执行额外的逻辑。
SQLAlchemy 是一个 SQL 工具包和对象关系映射(ORM)库,用于 Python 编程语言。它提供了一个高级的 SQL 工具和对象关系映射工具,允许开发者以 Python 类和对象的形式操作数据库,而无需编写大量的 SQL 语句。SQLAlchemy 建立在 DBAPI 之上,支持多种数据库后端,如 SQLite, MySQL, PostgreSQL 等。 SQLAlchemy 的核心功能: 对象关系映射(ORM): SQLAlchemy 允许开发者使用 Python 类来表示数据库表,使用类的实例表示表中的行。 开发者可以定义类之间的关系(如一对多、多对多),SQLAlchemy 会自动处理这些关系在数据库中的映射。 通过 ORM,开发者可以像操作 Python 对象一样操作数据库,这大大简化了数据库操作的复杂性。 表达式语言: SQLAlchemy 提供了一个丰富的 SQL 表达式语言,允许开发者以 Python 表达式的方式编写复杂的 SQL 查询。 表达式语言提供了对 SQL 语句的灵活控制,同时保持了代码的可读性和可维护性。 数据库引擎和连接池: SQLAlchemy 支持多种数据库后端,并且为每种后端提供了对应的数据库引擎。 它还提供了连接池管理功能,以优化数据库连接的创建、使用和释放。 会话管理: SQLAlchemy 使用会话(Session)来管理对象的持久化状态。 会话提供了一个工作单元(unit of work)和身份映射(identity map)的概念,使得对象的状态管理和查询更加高效。 事件系统: SQLAlchemy 提供了一个事件系统,允许开发者在 ORM 的各个生命周期阶段插入自定义的钩子函数。 这使得开发者可以在对象加载、修改、删除等操作时执行额外的逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值