【HNOI】 期望面积

  【题目描述】给定n个点,求这n个点组成凸包的期望面积。保证任意三点不共线。

  【数据范围】n<=100.

  首先我们知道凸包面积的计算为所有在凸包上相邻的点的叉积和,那么我们可以枚举两个点,然后求出这两个点在凸包上相邻的概率,然后再乘这两个向量的叉积,两点在凸包上的概率我们可以枚举所有的点,判断是否在枚举的向量的右面,在右面的话这些点就不能出现,最后除以二就行了。

  反思:因为用的double存的,所以如果最后直接输出答案的话,0.000000会算成-0.000000,所以要加一个精度= =。

//By BLADEVIL

#include <cstdio>

#define maxn 110



using namespace std;



int n;

int x[maxn],y[maxn];

double p[maxn];



bool judge(int i,int j,int k) {

    return ((x[j]-x[i])*(y[k]-y[i])-(y[j]-y[i])*(x[k]-x[i]))<0;

}



int main() {

    freopen("qs.in","r",stdin); freopen("qs.out","w",stdout);

    scanf("%d",&n);

    double ans=0;

    for (int i=1;i<=n;i++) scanf("%d%d%lf",&x[i],&y[i],&p[i]);

    for (int i=1;i<=n;i++)

        for (int j=1;j<=n;j++)

            if (i!=j) {

                double q=p[i]*p[j];

                for (int k=1;k<=n;k++)

                    if ((k!=i)&&(k!=j)&&(judge(i,j,k)))

                        q*=1-p[k];

                ans+=q*(x[i]*y[j]-y[i]*x[j]);

            }

    ans/=2;

    printf("%.6f",ans+1e-8);

    fclose(stdin); fclose(stdout);

    return 0;

}

 

你可能感兴趣的:(【HNOI】 期望面积)