CF第一场比赛的最后一题居然是计算几何.

这道题的考点也是比较多,所以来写一篇题解.

前置芝士

  1. 平面直角坐标系中两点距离公式:\(l=\sqrt{(X_1-X_2)^2+(Y_1-Y_2)^2}\)
  2. 海伦公式:在知道三边时用于计算三角形面积\(S=\sqrt{p(p-a)(p-b)(p-c)}\)(其中\(a,b,c\)为三角形三边,\(p=\frac{a+b+c}{2}\))
  3. 外接圆半径公式:\(R=\frac{abc}{4S}\)
  4. 解三角形

    (知道三边求角度):

    \(\cos B=\frac{a^2+c^2-b^2}{2ac}\)

    \(\cos A=\frac{b^2+c^2-a^2}{2bc}\)

    \(\cos C=\frac{a^2+b^2-c^2}{2ab}\)

    再将\(\cos A,\cos B,\cos C\)带入\(\arccos()\)求出角度

    (知道两边一夹角求第三边)

    \(c=\sqrt{a^2+b^2-2ab\cos C}\)
  5. 欧几里得算法(gcd):看起来和这题没什么关系,具体后面会讲到.

具体做法

先看一张图:



在图中的A,B,C为给出的点,可以发现这个正多边形与这个三角形的外接圆相同,圆心为O,AO=BO=CO,知道外接圆半径公式后可以求出AO,BO,CO,在会解三角形后可以得出\(\angle AOB\),\(\angle BOC\),以及\(\angle AOC\)(指图中大于\(180^\circ\)的那个角).可以发现这三个角存在一定的数量关系,及这三个角都可以表示为一个角的整数倍,及相邻黄色半径的夹角,设这个角为\(\angle\alpha\),于是图中的\(\angle AOB=3*\angle\alpha\),\(\angle BOC=2*\angle\alpha\),\(\angle AOC=6*\angle\alpha\),于是\(\angle\alpha=gcd(\angle AOB,gcd(\angle BOC,\angle AOC))\),角度知道后对于每个小三角形的三边都知道了,三角形个数也知道了,就可以求出总面积了.

代码

#include<bits/stdc++.h>
using namespace std;
const double pi=3.1415926;
double mod(double a,double b)//小数取模
{
return a-(int)(a/b)*b;
}
double gcd(double x,double y)//小数gcd
{
if(y<=0.0001)return x;
return gcd(y,mod(x,y));
}
double x,y,x2,y2,x3,y3;
int main()
{
scanf("%lf%lf%lf%lf%lf%lf",&x,&y,&x2,&y2,&x3,&y3);
//计算三角形三条边长
double a=sqrt((x-x2)*(x-x2)+(y-y2)*(y-y2));
double b=sqrt((x-x3)*(x-x3)+(y-y3)*(y-y3));
double c=sqrt((x2-x3)*(x2-x3)+(y2-y3)*(y2-y3));
double p=(a+b+c)/2;
double r=(a*b*c)/(4*sqrt(p*(p-a)*(p-b)*(p-c)));//通过r=(abc)/(4s)得出外接圆半径
//分别求出以三条边为低,外接圆半径为腰的三角形的顶角角度
double angle1=acos(1-(a*a)/(2*r*r));
double angle2=acos(1-(b*b)/(2*r*r));
double angle3=2*pi-angle1-angle2;
double angle=gcd(angle1,gcd(angle2,angle3))/pi*180;//题目所示的以正多边形边长为低接圆半径为腰的三角形的顶角角度
double side=sqrt(2*r*r-2*r*r*cos(angle/180*pi));//求出正多边形的边长
double P=(r*2+side)/2;
double S=sqrt(P*(P-r)*(P-r)*(P-side))/*三角形面积*/*(360/angle)/*三角形个数*/;//计算面积
printf("%.6lf",S);//保留6位小数输出
return 0;
}

「CF1C Ancient Berland Circus」的更多相关文章

  1. cf------(round)#1 C. Ancient Berland Circus(几何)

    C. Ancient Berland Circus time limit per test 2 seconds memory limit per test 64 megabytes input sta ...

  2. Codeforces Beta Round #1 C. Ancient Berland Circus 计算几何

    C. Ancient Berland Circus 题目连接: http://www.codeforces.com/contest/1/problem/C Description Nowadays a ...

  3. AC日记——codeforces Ancient Berland Circus 1c

    1C - Ancient Berland Circus 思路: 求出三角形外接圆: 然后找出三角形三条边在小数意义下的最大公约数; 然后n=pi*2/fgcd; 求出面积即可: 代码: #includ ...

  4. CodeForces - 1C:Ancient Berland Circus (几何)

    Nowadays all circuses in Berland have a round arena with diameter 13 meters, but in the past things ...

  5. Codeforces 1C Ancient Berland Circus

    传送门 题意 给出一正多边形三顶点的坐标,求此正多边形的面积最小值. 分析 为了叙述方便,定义正多边形的单位圆心角u为正多边形的某条边对其外接圆的圆心角(即外接圆的某条弦所对的圆心角). (1)多边形 ...

  6. codforces 1C Ancient Berland Circus(几何)

    题意 给出正多边形上三个点的坐标,求正多边形的最小面积 分析 先用三边长求出外接圆半径(海伦公式),再求出三边长对应的角度,再求出三个角度的gcd,最后答案即为\(S*2π/gcd\),S为gcd对应 ...

  7. C. Ancient Berland Circus(三点确定最小多边形)

    题目链接:https://codeforces.com/problemset/problem/1/C 题意:对于一个正多边形,只给出了其中三点的坐标,求这个多边形可能的最小面积,给出的三个点一定能够组 ...

  8. Codeforces 1 C. Ancient Berland Circus-几何数学题+浮点数求gcd ( Codeforces Beta Round #1)

    C. Ancient Berland Circus time limit per test 2 seconds memory limit per test 64 megabytes input sta ...

  9. 众安「尊享e生」果真牛的不可一世么?

    近日,具有互联网基因的.亏损大户(成立三年基本没盈利,今年二季度末亏损近4亿,你能指望它多厉害?).财产险公司—众安推出“尊享e生”中高端医疗保险(财险公司经营中高端医疗真的很厉害?真的是中高端医疗险 ...

随机推荐

  1. CentOS7安装jenkis

    注意:终止运行Ctrl+c , 退回到shell命令Ctrl+d 一.先检查是否有java [root@huangyh huangyh]#  rpm -qa |grep java 或 java 因为C ...

  2. P2774 方格取数(网络流)

    https://www.luogu.com.cn/problem/P2774 在一个有 m×n 个方格的棋盘中,每个方格中有一个正整数. 现要从方格中取数,使任意2个数所在方格没有公共边,且取出的数的 ...

  3. IOS XE-show memory

    有些时候,我们可能会遇到IOS XE设备的high memory的情况.我们可以使用的命令去查看相关信息. 例如: Router# show version Router# show memory R ...

  4. Springboot - 更优雅的方式请求发 HTTP 请求

    参考:https://www.cnblogs.com/javazhiyin/p/9851775.html RestTemplate 是 Spring 提供的用于访问Rest 服务的客户端RestTem ...

  5. redhat 7.6 iptables 配置

    1.查看iptables默认表(filter) iptables -L -n 2.iptables 默认内链(filter)表三种: INPUT:处理进入防火墙的数据包 FORWARD:源自其他计算机 ...

  6. Aery的UE4 C++游戏开发之旅(4)加载资源&创建对象

    目录 资源的硬引用 硬指针 FObjectFinder<T> / FClassFinder<T> 资源的软引用 FSoftObjectPaths.FStringAssetRef ...

  7. 每个 JavaScript 开发者都该懂的 Unicode

    英文原文标题:what-every-javascript-developer-should-know-about-unicode (译者注:本文含有Unicode辅助平面的特殊字符,部分浏览器可能无法 ...

  8. masonry使用添加紧凑、抗压属性

    // 内容紧凑 - 优先完全显示内容,且不多占像素. [self.leftLabel setContentHuggingPriority:UILayoutPriorityDefaultHigh for ...

  9. java课后问题解答

    1.当有多个嵌套的try…catch…finally时,要特别注意finally的执行时机 答:当有多层嵌套的finally时,异常在不同的层次抛出 ,在不同的位 置抛出,可能会导致不同的finall ...

  10. nginx的负载介绍

    指定上游服务器的upstream与server指令 指令介绍 Syntax: upstream name { ... } Default: — Context: http Syntax: server ...