L3-021 神坛 (叉积排序+向量积求面积)

题目链接 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;
}
原文地址:https://www.cnblogs.com/zpj61/p/13435927.html