poj 1385-Lifting the Stone解题报告
任意质量分布均匀的多边形的重心位置,可以假定其单位面积质量为1,则面积即可表示质量,而对于质量分布均匀的多边形的重心,需要先以任意一个顶点为参考点,把多边形分为多个三角形,分别求这些三角形的重心位置,此时多边形的质量全在每个三角形的重心上了,即在顶点上,此时,就可以使用gx=Σ(xi*areai)/Σ(areai),gy=Σ(yi*areai)/Σ(areai)期中xi,yi为第i个三角形的中心位置,areai为第i个三角形的面积
View Code
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #define N 1000005 5 using namespace std; 6 struct point 7 { 8 double x,y; 9 }; 10 point p[N]; 11 double cross(point p1,point p2,point p3) 12 { 13 return (p2.x-p1.x)*(p3.y-p1.y)-(p2.y-p1.y)*(p3.x-p1.x); 14 } 15 int main() 16 { 17 int t; 18 int i,j,k,n; 19 double area,sum,gx,gy,x1,y1; 20 scanf("%d",&t); 21 while(t--) 22 { 23 scanf("%d",&n); 24 for(i=0;i<n;i++) 25 scanf("%lf%lf",&p[i].x,&p[i].y); 26 gx=gy=sum=0.0; 27 for(i=1;i<n-1;i++) 28 { 29 area=cross(p[0],p[i],p[i+1]); 30 sum+=area; 31 x1=(p[0].x+p[i].x+p[i+1].x); 32 y1=(p[0].y+p[i].y+p[i+1].y); 33 gx+=(x1*area); 34 gy+=(y1*area); 35 } 36 gx/=(sum*3); 37 gy/=(sum*3); 38 printf("%0.2lf %0.2lf\n",gx,gy); 39 } 40 return 0; 41 }