现在有一个圆心坐标在 (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;
}