您的位置:首页 > 其它

HDU 1115 Lifting the Stone

2016-07-09 23:37 316 查看
http://acm.hdu.edu.cn/showproblem.php?pid=1115

题意:求凸多边形的重心

思路:明明是SB题,做法就是三角剖分每个三角形的重心乘上三角形面积的矢量和,最后除以总面积,我愣是WA了3天,最后才知道要把所有的除数放到最后除才不会有精度误差,舞草

#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
#include<algorithm>
#define dou double
struct Point{
dou x,y;
Point(){}
Point(dou x0,dou y0):x(x0),y(y0){}
}p[5000005];
int n;
int read(){
int t=0,f=1;char ch=getchar();
while (ch<'0'||ch>'9'){if (ch=='-')f=-1;ch=getchar();}
while ('0'<=ch&&ch<='9'){t=t*10+ch-'0';ch=getchar();}
return t*f;
}
Point operator +(Point p1,Point p2){
return Point(p1.x+p2.x,p1.y+p2.y);
}
dou operator *(Point p1,Point p2){
return p1.x*p2.y-p1.y*p2.x;
}
Point operator *(Point p1,dou x){
return Point(p1.x*x,p1.y*x);
}
Point operator /(Point p1,dou x){
return Point(p1.x/x,p1.y/x);
}
Point operator -(Point p1,Point p2){
return Point(p1.x-p2.x,p1.y-p2.y);
}
dou area(Point p1,Point p2,Point p3){
return (p2-p1)*(p3-p1);
}
int main(){
int T=read();
while (T--){
n=read();
dou S=0;Point ans(0,0);
for (int i=1;i<=n;i++)
scanf("%lf%lf",&p[i].x,&p[i].y);
p[n+1]=p[1];
for (int i=2;i<n;i++){
S+=((p[i]-p[1])*(p[i+1]-p[1]));
ans=ans+((p[i]+p[i+1]+p[1]))*((p[i]-p[1])*(p[i+1]-p[1]));
}
ans=ans/(3.0*S);
double Ansx,Ansy;
Ansx=(double)(ans.x);
Ansy=(double)(ans.y);
printf("%.2f %.2f\n",Ansx,Ansy);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: