UVA11186 Circum Triangle(计算几何基础)

现在有一个圆心坐标在 (0,0) 的圆,给出 n 个点的极角,再给出圆的半径 r

可以证明任意在圆上的三个点是不共线的,所以求出任意三个点所围成的三角形的面积之和 

题目告诉了圆心的坐标和圆的半径,以及点的极角,所以很容易求得所有点的坐标,然后暴力枚举,利用向量的叉乘计算各个三角形的面积

由于点的个数只有  500   ,所以 O(n^3)  的时间复杂度完全可以。

个人感觉用结构体包装一下比较好,以下代码仅供参考

const double pi=acos(-1.0);
const int N=500+5;

    int i,j,k;
    int n,m,t;
    pair<double,double> p[N];
    int cnt;

double torad(double x)
{
    return pi*x/180;
}

void add(double rad)
{
    double x=m*cos(rad);
    double y=m*sin(rad);
    p[++cnt].fr=x;
    p[cnt].sc=y;
}

double area(int x,int y,int z)
{
    double ans=0;
    pair<double,double> v=make_pair(p[y].fr-p[x].fr,p[y].sc-p[x].sc);
    pair<double,double> u=make_pair(p[z].fr-p[x].fr,p[z].sc-p[x].sc);
    ans=(v.fr*u.sc-u.fr*v.sc)/2.0;
    return fabs(ans);
}

int main()
{
    //IOS;
    while(~sdd(n,m),n+m){
        cnt=0;
        for(int i=1;i<=n;i++){
            double x;
            sf(x); add(torad(x));
        }
        double ans=0;
        for(int i=3;i<=n;i++){
            for(int j=2;j<i;j++){
                for(int k=1;k<j;k++){
                    ans+=area(i,j,k);
                }
            }
        }
        printf("%lld\n",(ll)(ans+0.5));
    }
    //PAUSE;
    return 0;
}

 

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 酷酷鲨 设计师:CSDN官方博客 返回首页