L3-021 神壇 (30分) (計算幾何最小三角形面積)
阿新 • • 發佈:2020-11-12
題意:給一個二維座標點集,求最小三角形面積。
做法:列舉一個點,其他點相對於這個點極角排序,對排序後的點集列舉相鄰的兩個點,與答案取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\n",ans/2); // 這個 /2 是計算三角形面積那裡的/2 }