L3-021 神坛 (30分) (计算几何最小三角形面积)

题意:给一个二维坐标点集,求最小三角形面积。

做法:枚举一个点,其他点相对于这个点极角排序,对排序后的点集枚举相邻的两个点,与答案取min。

const int N = 5555;

struct point {
  int x, y;
  point(){}
  point (int _x, int _y) {
    x = _x, y = _y;
  }
}p[N];

vector<point> v;

void run() {
  int n = rd();
  rep(i,1,n) p[i].x = rd(), p[i].y = rd();
  double ans = INF;
  rep(i,1,n) { // 枚举一个点 
    v.clear();
    rep(j,1,n) { // 枚举其他点 
      if (i == j) continue;
      v.pb(point(p[j].x-p[i].x,p[j].y-p[i].y)); // 其他点相对与枚举的点的关系(向量) 
    }
    sort(all(v),[&](point a, point b) {
      return a.x * b.y > b.x * a.y; // 排序方式可以随意,这里用顺时针(两向量叉积后>0)
    });
    for (int i = 0; i < sz(v)-1; i++) ans = min(ans, double(abs(v[i].x*v[i+1].y-v[i].y*v[i+1].x))); // 枚举排序后点集相邻的两个点(向量),叉积算面积 
  }
  printf("%.3lf
",ans/2); // 这个 /2 是计算三角形面积那里的/2
}
原文地址:https://www.cnblogs.com/hznudreamer/p/13965324.html