题意:给一个二维坐标点集,求最小三角形面积。
做法:枚举一个点,其他点相对于这个点极角排序,对排序后的点集枚举相邻的两个点,与答案取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
}