求重心

#include <bits/stdc++.h>
#define rep(i, L, R) for (int i = L; i <= R; ++i)
using namespace std;
const double eps = 1e-8;
const double inf = 1e20;
const int N = 1000007;
inline int sgn(double x) {
    if (fabs(x) < eps) return 0;
    return x > 0 ? 1 : -1;
}
struct point {
    double x, y;
    point operator+(point b) { return {x + b.x, y + b.y}; };
    point operator-(point b) { return {x - b.x, y - b.y}; };
    point operator*(double k) { return {x * k, y * k}; };
    point operator/(double k) { return {x / k, y / k}; };
};
typedef point vec;
double cross(vec a, vec b) { return a.x * b.y - a.y * b.x; }
double S(point *a, int n) {  //数组起始位置 多边形有多少个点
    double res = 0;
    for (int i = 0; i < n; ++i) res += cross(a[i], a[(i + 1) % n]);
    return res / 2;  // 面积有正负
}
point center(point *a, int n) {  // 求重心
    point ans = {0, 0};
    double Sa = S(a, n);
    if (Sa == 0) return ans;
    for (int i = 0; i < n; ++i)
        ans = ans + (a[i] + a[(i + 1) % n]) * cross(a[i], a[(i + 1) % n]);
    return ans / Sa / 6;
}
point a[N];
int T, n;
int main() {
    scanf("%d", &T);
    while (T--) {
        scanf("%d", &n);
        rep(i, 1, n) scanf("%lf%lf", &a[i].x, &a[i].y);
        point ans = center(a + 1, n);
        printf("%.2lf %.2lf\n", ans.x, ans.y);
    }
    return 0;
}
算法竞赛之路 文章被收录于专栏

整理、记录算法竞赛的好题

全部评论

相关推荐

06-23 11:43
门头沟学院 Java
allin校招的烤冷...:我靠,今天中午我也是这个hr隔一个星期发消息给我。问的问题还是一模一样的😅
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务