UVA 11186 Circum Triangle (枚举三角形优化)(转)

题意:圆上有n个点,求出这n个点组成的所有三角形的面积之和

 

题解:

当我们要求出S(i,j,k)时,我们需要假设k在j的左侧,k在i与j之间,k在i的右侧。

 如果k在 j的左侧  那么 S(i,j,k) = S(i,k,o)+s(i,j,o) - s(k,i,o); 显然 只要k在j的左侧  s(i,j,0) 在用来求 做和用的。

如果k在 的i右侧  那么 S(i,j,k) = S(i,k,o)+s(i,j,o) - s(k,j,o); 显然 只要k在i的右侧  s(i,j,0) 在用来求 做和用的。

如果k在 i,j的中间  那么 S(i,j,k) = S(j,k,o)+s(i,k,o) - s(i,j,o); 显然 只要k在i,j的中间  s(i,j,0) 在用来求 做差用的。

那么 我们就可以对于 线段 i,j  对于后面 或者前面的点来说 都需要加上oji 这一块面积  而对于  ij 中间的 点来说  都需要 减去这一块。

那么对于这一块面积。  总共的 需求为   当k在左侧的时候 : n - j - 1    k在右侧是时候   为  i   加起来为  n - j + i - 1;

对于k位于中间来说。   总共需要减去 个数为   j - i  - 1个。

那么 总共就是  n + 2i - 2j  个

 

#include<set>
#include<map>
#include<queue>
#include<stack>
#include<cmath>
#include<vector>
#include<string>
#include<cstdio>
#include<cstring>
#include<iomanip>
#include<stdlib.h>
#include<iostream>
#include<algorithm>
using namespace std;
#define eps 1E-8
/*注意可能会有输出-0.000*/
#define Sgn(x) (x<-eps? -1 :x<eps? 0:1)//x为两个浮点数差的比较,注意返回整型
#define Cvs(x) (x > 0.0 ? x+eps : x-eps)//浮点数转化
#define zero(x) (((x)>0?(x):-(x))<eps)//判断是否等于0
#define mul(a,b) (a<<b)
#define dir(a,b) (a>>b)
typedef long long ll;
typedef unsigned long long ull;
const int Inf=1<<28;
const ll INF=1ll<<60;
const double Pi=acos(-1.0);
const int Mod=1e9+7;
const int Max=10010;
double g[Max];
int main()
{
int n,r;
while(~scanf("%d %d",&n,&r))
{
    if(!n&&!r)
        break;
    for(int i=0;i<n;++i)
    {
        scanf("%lf",&g[i]);
        g[i]=g[i]/180*Pi;
    }
    sort(g,g+n);
    double ans=0;
    for(int i=0;i<n;++i)
    {
        for(int j=i+1;j<n;++j)
        {
            ans+=(n+2*i-2*j)*1.0*sin(g[j]-g[i]);
        }
    }
    ans=ans*r*r*0.5;
    printf("%.0f\n",ans);
}
return 0;
}

 参考:(找不到原网址了,如有人知道请联系我,谢谢了)

posted @ 2016-12-11 21:43  专注如一  阅读(407)  评论(0编辑  收藏  举报