UVA - 11186 Circum Triangle (几何)

题意:有N个点,分布于一个圆心在原点的圆的边缘上,问所形成的所有三角形面积之和。

分析:

1、sin的内部实现是泰勒展开式,复杂度较高,所以需预处理。

2、求出每两点的距离以及该边所在弧所对应的圆周角。一条弧所对圆周角等于它所对圆心角的一半。

3、S = 1/2*absinC求三角形面积即可。

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cctype>
#include<cmath>
#include<iostream>
#include<sstream>
#include<iterator>
#include<algorithm>
#include<string>
#include<vector>
#include<set>
#include<map>
#include<stack>
#include<deque>
#include<queue>
#include<list>
#define lowbit(x) (x & (-x))
const double eps = 1e-8;
inline int dcmp(double a, double b){
    if(fabs(a - b) < eps) return 0;
    return a > b ? 1 : -1;
}
typedef long long LL;
typedef unsigned long long ULL;
const int INT_INF = 0x3f3f3f3f;
const int INT_M_INF = 0x7f7f7f7f;
const LL LL_INF = 0x3f3f3f3f3f3f3f3f;
const LL LL_M_INF = 0x7f7f7f7f7f7f7f7f;
const int dr[] = {0, 0, -1, 1, -1, -1, 1, 1};
const int dc[] = {-1, 1, 0, 0, -1, 1, -1, 1};
const int MOD = 1e9 + 7;
const double pi = acos(-1.0);
const int MAXN = 500 + 10;
const int MAXT = 10000 + 10;
using namespace std;
int N;
double R;
double Sin[MAXN][MAXN];
double dist[MAXN][MAXN];
struct Node{
    double x, y, rad;
    void read(){
        scanf("%lf", &rad);
        rad = rad / 180.0 * pi;
        x = R * cos(rad);
        y = R * sin(rad);
    }
}num[MAXN];
double getDist(int i, int j){
    return sqrt((num[i].x - num[j].x) * (num[i].x - num[j].x) + (num[i].y - num[j].y) * (num[i].y - num[j].y));
}
int main(){
    while(scanf("%d%lf", &N, &R) == 2){
        if(N == 0 && R == 0) return 0;
        memset(Sin, 0, sizeof Sin);
        memset(dist, 0, sizeof dist);
        for(int i = 0; i < N; ++i){
            num[i].read();
        }
        for(int i = 0; i < N; ++i){
            for(int j = i + 1; j < N; ++j){
                Sin[i][j] = sin(fabs(num[j].rad - num[i].rad) / 2.0);
                dist[i][j] = dist[j][i] = getDist(i, j);
            }
        }
        double sum = 0.0;
        for(int i = 0; i < N; ++i){
            for(int j = i + 1; j < N; ++j){
                for(int k = j + 1; k < N; ++k){
                    sum += dist[i][j] * dist[i][k] * Sin[j][k] / 2;
                }
            }
        }
        double ans = round(sum);
        printf("%.0lf\n", ans);
    }
    return 0;
}

  

时间: 2024-11-02 16:45:13

UVA - 11186 Circum Triangle (几何)的相关文章

uva 11186 - Circum Triangle(几何)

题目链接:uva 11186 - Circum Triangle 枚举两点,计算该两点与圆心构成的三角形对ans的贡献值. #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> using namespace std; const int maxn = 505; const double pi = 4 * atan(1); double A[maxn]; doub

UVA 11186 - Circum Triangle(计算几何+容斥)

这题用n^2的算法能过,先任意枚举两点,和圆心组成的三角形求面积,这个面积可能会被加(n - 2)次,但是要注意,如果有3点是在同一侧,那么要减去,于是在枚举一遍,每次枚举一个点,然后枚举和这个点度数相差180以内的点,求面积,这个面积要减去2 * (j - i + 1)次 代码: #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> using namespac

UVA 11971 - Polygon(概率+几何概型)

UVA 11971 - Polygon 题目链接 题意:给一条长为n的线段,要选k个点,分成k + 1段,问这k + 1段能组成k + 1边形的概率 思路:对于n边形而言,n - 1条边的和要大于另外那条边,然后先考虑3边和4边形的情况,根据公式在坐标系中画出来的图,总面积为x,而不满足的面积被分成几块,每块面积为x/2k,然后在观察发现一共是k + 1块,所以符合的面积为x?x?(k+1)/2k,这样一来除以总面积就得到了概率1?(k+1)/2k 代码: #include <cstdio>

uva 1543 - Telescope(dp+几何)

大数除法说的比较少或许不像加法减法那样简单,或许是用的不太多.到底怎么我也不知道. 反正你会了加法减法,乘法而不会除法,就像是,打开电脑而不玩游戏,心里难受. 我是从看到了大神博客后学习了一下. http://blog.csdn.net/hitwhylz/article/details/9700935 博客中讲的很详细 让人一看就懂,我很佩服这位同学.果断的关注了. 毕竟别人写的是别人的. 自己写的才是自己的 .于是我就捋了捋,模仿这写了一遍: 思想就是:用减法来代替除法,但是一次一次的减太慢,

【UVA】11437 Triangle Fun(简单几何)

先求出在A,B,C上的三等分点在,这里使用向量运算进行加减就行了. 之后通过求出的三等分点 和 顶点的连线,求出3个交点. 最后用求出的三个交点算出面积. 注意:由于可能是钝角三角形,需要求其绝对值. 14116428 11437 Triangle Fun Accepted C++ 0.015 2014-08-30 03:27:36 #include <iostream> #include <cstdlib> #include <cstdio> #include <

uva 319 - Pendulum(几何)

题目链接:uva 319 - Pendulum 注意高度不能高过水平线,一种周期是绕某点一直转圈,一种周期是返回起点. #include <cstdio> #include <cstring> #include <cmath> #include <vector> #include <algorithm> using namespace std; const double pi = 4 * atan(1); const double eps = 1

【UVA 11401】Triangle Counting

题 题意 求1到n长度的n根棍子(3≤n≤1000000)能组成多少不同三角形. 分析 我看大家的递推公式都是 a[i]=a[i-1]+ ((i-1)*(i-2)/2-(i-1)/2)/2; 因为以最大长度i 为最大边的三角形有 第二边为i-1.i-2....2 分别有 i-2个.i-3.... .1个,总共就有(i-1)*(i-2)/2个. 2 到 i-1 做第二边时,有(i-1)/2条边算到了两边相等,也就是要减去 (i-1)/2,因为第二边的在第三边出现了,所以算了两次,再除以2. 我的递

几何基础专题

UVA 11437 Triangle Fun UVA 11800 Determine the Shape 四边形判定 UVA 11646 Athletics Track UVA 11817 Tunnelling the Earth 球面距离 UVA 1473 Dome of Circus UVA 11524 InCircle UVA 11731 Ex-circles 旁切圆 UVA 12300 Smallest Regular Polygon UVA 10566 Crossed Ladders

uva11186

题目连接:UVA - 11186 意外发现这道题,最近发现贡献度这个东西很常见啊... 可是我什么都不会... 先存一下http://www.cnblogs.com/zhuanzhuruyi/p/6160694.html 1 #include<set> 2 #include<map> 3 #include<queue> 4 #include<stack> 5 #include<cmath> 6 #include<vector> 7 #