【题目描述】给定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; }
原文:http://www.cnblogs.com/BLADEVIL/p/3650018.html