codeforces 1A

【1C. Ancient Berland Circus】    【立体几何

三角形面积的几种求法:

1、s=(1/2)*底*高 
2、海伦公式:S = √[p(p-a)(p-b)(p-c) ]其中p=1/2(a+b+c) 

                          =(1/4)√[(a+b+c)(a+b-c)(a+c-b)(b+c-a)]
3、s=1/2的周长*内切圆半径 
4、s=1/2absinC,s=1/2acsinB ,s=1/2bcsinA

5、三角形面积=abc/4R(其中R是三角形外接圆半径)

6、S = 叉积/2,叉积公式:

题意:

已知一个斗兽场是一个正多边形(边数最多是100),给我们三个点,求这个斗兽场的最小面积。输入均为有效值。

思路:

因为是正n边形,所以S = N*(R*R*sin(x)/2),R是正n边形外接圆的半径。

由上面的公式2跟公式5可以求出R

设三角形的三条边对应的圆心角分别是:A、B、C(圆心角很好求,比如 A = acos(R*R+R*R-a*a)/(2*R*R))

x = gcd(A,B,C), n = 2*π/x

求浮点数的gcd,需要用到fmod函数,这里的fgcd需要设置一个eps,eps=1e-2才行(当然eps=-3、-4都是可以的)
double gcd(double a, double b){
	if(fabs(a) < eps) return b;
	if(fabs(b) < eps) return a;
	return gcd(b, fmod(a, b));
}

【(⊙o⊙)…老了老了,简单的计算几何都不会了...】

#include <bits/stdc++.h>
using namespace std;

const double eps = 1e-2;
const double pai = acos(-1.0);

double gcd(double a, double b){
	if(fabs(a) < eps) return b;
	if(fabs(b) < eps) return a;
	return gcd(b, fmod(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((bx-cx)*(bx-cx) + (by-cy)*(by-cy));
	double b = sqrt((ax-cx)*(ax-cx) + (ay-cy)*(ay-cy));
	double c = sqrt((ax-bx)*(ax-bx) + (ay-by)*(ay-by));
	
	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(1-a*a/(2*R*R));
	double B = acos(1-b*b/(2*R*R));
	double C = 2*pai-A-B;
	
	double O = gcd(A, gcd(B, C));
	
	printf("%.8lf\n", R*R*sin(O)*pai/O);
	return 0;
} 





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值