求重心
#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; }
算法竞赛之路 文章被收录于专栏
整理、记录算法竞赛的好题