【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;
}

 

posted on 2014-04-07 13:11  BLADEVIL  阅读(1463)  评论(0编辑  收藏  举报