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 }
posted @ 2012-06-06 23:01  zhenhai  阅读(191)  评论(0编辑  收藏  举报