题目链接 https://pintia.cn/problem-sets/994805046380707840/problems/994805046577840128
题意:给定n个点求三角形最小面积;
题解:该题两个难点:
1.该怎么遍历(正常枚举会超时)。
2.用什么方法计算三角形面积。
解决方案:利用极角排序(先向量后叉积)来遍历,同时利用向量积来计算三角形面积。
Ac 代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+5;
typedef long long ll;
struct node{
ll x,y;
}p[maxn],b[maxn];
int cmp(node a,node b){ //叉积排序;
return a.x*b.y>a.y*b.x;
}
int main(){
int n;
cin>>n;
for(int i=0;i<n;i++){
cin>>p[i].x>>p[i].y;
}
ll ans=1e18;
for(int i=0;i<n;i++){
int k=0;
for(int j=0;j<n;j++){
if(i==j) continue;
b[k].x=p[j].x-p[i].x;
b[k++].y=p[j].y-p[i].y;
}
sort(b,b+k,cmp);
for(int j=1;j<k;j++){
ans=min(ans,abs(b[j].x*b[j-1].y-b[j].y*b[j-1].x)); //叉积计算面积;
}
}
printf("%.3f",ans/2.0);
return 0;
}