hdu1115求凸包重心

来源:互联网 发布:la域名查询 编辑:程序博客网 时间:2024/05/17 03:42

题目链接:点击打开链接

用模板就好了

#include <iostream>#include <cstdio>#include <cstdlib>#include <cstring>#include <algorithm>#include <cmath>using namespace std;const int maxn=1e6+10;struct Point//点 向量{    double x,y;    Point(double x=0,double y=0):x(x),y(y) {}};typedef  Point  Vector;//向量使用点作为表示方法 结构相同 为了代码清晰const double eps = 1e-8;int dcmp(double x) //三态函数 处理与double零有关的精度问题{    if(fabs(x) < eps)    return 0;    return x<0 ? -1 : 1;}//向量运算Vector operator + (Vector A, Vector B){    return Vector(A.x+B.x, A.y+B.y);}Vector operator - (Vector A, Vector B){    return Vector(A.x-B.x, A.y-B.y);}Vector operator * (Vector A, double p){    return Vector(A.x*p, A.y*p);}Vector operator / (Vector A, double p){    return Vector(A.x/p, A.y/p);}bool operator == (const Vector& A, const Vector& B){    return dcmp(A.x-B.x)==0 && dcmp(A.y-B.y)==0;}bool operator < (const Point&a,const Point &b){    return a.x<b.x||(a.x==b.x&&a.y<b.y);}double Dot(Vector A, Vector B) //向量点积{    return A.x * B.x + A.y * B.y;}double Cross(Vector A, Vector B)  //向量叉积{    return A.x * B.y - A.y * B.x;}double Area(Point a,Point b,Point c){    return (b.x-a.x)*(c.y-a.y)-(c.x-a.x)*(b.y-a.y);}Point tubaozhongxin(Point ma[],int n){    int i;    Point p=ma[0];    Point a=ma[1];    double hx=0.0,hy=0.0,sum_area=0.0;    for(i=2;i<n;i++)    {        Point b=ma[i];        double sa=Area(p,a,b);        hx+=(p.x+a.x+b.x)*sa;        hy+=(p.y+a.y+b.y)*sa;        sum_area+=sa;        a=b;    }    Point t;    t.x=hx/sum_area/3; t.y=hy/sum_area/3;    return t;}int main(){   int T,n;   Point p[maxn];   scanf("%d",&T);   while(T--){    scanf("%d",&n);    for(int i=0;i<n;i++)        scanf("%lf %lf",&p[i].x,&p[i].y);    Point temp=tubaozhongxin(p,n);    printf("%.2lf %.2lf\n",temp.x,temp.y);   }    return 0;}