hdu 1115 Lifting the Stone 题目: acm.hdu.edu.cn/showproblem.php?pid=1115 #include <stdio.h> //质量均匀的多边形,重心求法: struct //把其看做N个三角形的重心,质量集中每个在三角形的重心上 {double x,y; double sum; //如果一个多边形其质量只集中在顶点上 }zx[1111111]; //那么可以用加权平均数求重心 double a[1111111]={0},b[1111111]={0}; // (每个三角形重心*其面积)的和 除以 多边形的总面积 // A为总面积,A[i]为每个三角形的面积,C[i]为每个三角形的重心 int main() //C=sigma(A[i] * C[i]) / A (i=1…N) {int i,t,m; //Ci=Centroid(△ O P[i] P[i+1]) double s,xx,yy; // = (O + ↑P[i] +↑P[i+1] )/3 scanf("%d",&t); //C=sigma((↑P[i] +↑P[i+1])(↑P[i] ×↑P[i+1]) ) /(6A) while(t--) {scanf("%d",&m); for(i=1;i<=m;i++) scanf("%lf%lf",&a[i],&b[i]); //把一块质量均匀分布的多边形分成多个三角形重心 //三角形的重心可以求,面积就等于其质量; //三角形的重心乘面积,相当于把质量都集中在一个顶点上 for(i=1;i<m;i++) { zx[i].x=(a[i]+a[i+1]); zx[i].y=(b[i]+b[i+1]); zx[i].sum=(a[i]*b[i+1]-b[i]*a[i+1]); } zx[i].x=(a[i]+a[1]); zx[i].y=(b[i]+b[1]); zx[i].sum=(a[i]*b[1]-b[i]*a[1]); xx=yy=s=0; for(i=1;i<=m;i++) {xx=xx+zx[i].sum*zx[i].x; yy=yy+zx[i].sum*zx[i].y; s+=zx[i].sum/2.0; } //相当于 xx/3(三角形重心),s/2 三角形面积,这样在最后除 6 可以提高精度 xx=xx/(6.0*s); yy=yy/(6.0*s); printf("%.2lf %.2lf/n",xx,yy); } return 0; }