codeforces Round #1 C题 Ancient Berland Circus (计算几何)

这题的思路很好想,分成以下4步:

1:求外切园半径

2:求三个圆心角

3:求三个圆心角的最大公约数

4:最大公约数就是最大的正多边形内角,求面积即可。

但是每一步都不会求啊。。。。sad。。。当想到第3步的时候甚至觉得应该用别的方法来求。。要换方法。。几何太渣了。

代码如下:

#include <iostream>
#include <string.h>
#include <math.h>
#include <queue>
#include <algorithm>
#include <stdlib.h>
#include <map>
#include <set>
#include <stdio.h>
using namespace std;
#define LL __int64
#define pi acos(-1.0)
const int mod=100000000;
const int INF=0x3f3f3f3f;
const double eqs=0.01;
struct Point
{
    double x, y;
}p[4];
bool dmp(double x, double y)
{
    return fabs(x-y)<eqs;
}
double fgcd(double x, double y)
{
    if(dmp(x,0)) return y;
    if(dmp(y,0)) return x;
    return fgcd(y,fmod(x,y));
}
double dist(Point f1, Point f2)
{
    return sqrt((f1.x-f2.x)*(f1.x-f2.x)+(f1.y-f2.y)*(f1.y-f2.y));
}
int main()
{
    double s, r, ang[4], d[4], pp, angle;
    int i;
    for(i=0;i<3;i++){
        scanf("%lf%lf",&p[i].x,&p[i].y);
    }
    for(i=0;i<3;i++){
        d[i]=dist(p[i],p[(i+1)%3]);
    }
    pp=(d[0]+d[1]+d[2])/2.0;
    s=sqrt(pp*(pp-d[0])*(pp-d[1])*(pp-d[2]));
    r=d[0]*d[1]*d[2]/(4*s);
    ang[0]=acos(1-d[0]*d[0]/(2*r*r));
    ang[1]=acos(1-d[1]*d[1]/(2*r*r));
    ang[2]=2*pi-ang[0]-ang[1];
    angle=fgcd(ang[0],ang[1]);
    angle=fgcd(angle,ang[2]);
    printf("%.6f\n",r*r*pi*sin(angle)/angle);
    return 0;
}
时间: 2024-10-13 22:59:54

codeforces Round #1 C题 Ancient Berland Circus (计算几何)的相关文章

Codeforces Beta Round #1 C. Ancient Berland Circus

果然Java还是不靠谱啊,一个NaN把我整了半天~~ 题目大意: 有一个正多边形,给出任意三个顶点的坐标,求这个正多边形的最小面积. 解题思路: 首先要知道这三个顶点组成的三角形的外接圆一定是这个正多边形的外接圆. 用过计算出三角形的三边长,可以计算出三角型面积,进而推出外接圆半径. 可以得到三个圆心角,找出最大公约数,那就是最大角度. 就可以计算出多边形面积了~~ 下面是代码: import java.text.DecimalFormat; import java.util.Scanner;

CodeForce-1C Ancient Berland Circus

Ancient Berland Circus Nowadays all circuses in Berland have a round arena with diameter 13 meters, but in the past things were different. In Ancient Berland arenas in circuses were shaped as a regular (equiangular) polygon, the size and the number o

Educational Codeforces Round 21 G. Anthem of Berland(dp+kmp)

题目链接:Educational Codeforces Round 21 G. Anthem of Berland 题意: 给你两个字符串,第一个字符串包含问号,问号可以变成任意字符串. 问你第一个字符串最多包含多少个第二个字符串. 题解: 考虑dp[i][j],表示当前考虑到第一个串的第i位,已经匹配到第二个字符串的第j位. 这样的话复杂度为26*n*m*O(fail). fail可以用kmp进行预处理,将26个字母全部处理出来,这样复杂度就变成了26*n*m. 状态转移看代码(就是一个kmp

构造 Codeforces Round #Pi (Div. 2) B. Berland National Library

题目传送门 1 /* 2 题意:给出一系列读者出行的记录,+表示一个读者进入,-表示一个读者离开,可能之前已经有读者在图书馆 3 构造:now记录当前图书馆人数,sz记录最小的容量,in数组标记进去的读者,分情况讨论一下 4 */ 5 /************************************************ 6 * Author :Running_Time 7 * Created Time :2015-8-6 0:23:37 8 * File Name :B.cpp 9

CodeForces 1C Ancient Berland Circus

题意:给定三个点,求包含三点的正多边形最小面积: 思路:求圆心角最大公约数,多边形面积=每个小三角形面积和: #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #include<stack> #include<string> #include<map> #include<iostream> using namespace

Ancient Berland Circus CodeForces - 1C

题意:给定一个正多边形的三个顶点,求这个正多边形的最小面积. 思路:首先,边数越小面积越小,所以只要确定出包含这三个顶点的边数最小的正多边形即可.这个三角形和正多边形外接同一个圆.所以先求出外接圆的半径,再求出三个圆心角,易得这个多边形的边所对应的圆心角可被这三个圆心角整除,所以三个圆心角的gcd就是多边形边所对的圆心角,然后2π除一下就得到是几边形,之后就可计算面积了 海伦公式: p=(a+b+c)/2,S=√p(p-a)(p-b)(p-c)(a,b,c为三角形的三边,S为三角形面积) 求外接

Educational Codeforces Round 21 A-E题题解

A题      ............太水就不说了,贴下代码 #include<string> #include<iostream> #include<cstring> #include<cmath> #include<algorithm> #include<vector> #include<queue> #include<cstdio> using namespace std; int n,m; int m

Codeforces Round #Pi (Div. 2)——set——Berland National Library

Berland National Library has recently been built in the capital of Berland. In addition, in the library you can take any of the collected works of Berland leaders, the library has a reading room. Today was the pilot launch of an automated reading roo

Educational Codeforces Round 23 补题小结

昨晚听说有教做人场,去补了下玩. 大概我的水平能做个5/6的样子? (不会二进制Trie啊,我真菜) A. 傻逼题.大概可以看成向量加法,判断下就好了. #include<iostream> #include<cstdio> #include<algorithm> #include<cmath> using namespace std; int x1,x2,yy1,y2,x,y; int main(){ scanf("%d%d%d%d%d%d&qu