平面最大三角形面积 Largest Triangle Kattis - largesttriangle

题目

题意:
给定一些点,求出任选三点的最大三角形面积

题解:
首先想到最大的面积应该出现在凸包上。(应该很好猜)

思路:

  • 暴力枚举凸包上的任意两点,
  • 这个过程不太好描述,看代码ba)可以想到,第三个点是单向的(也就是下标只会增加),
    因此复杂度是:\(n^2\)

代码:


#include<bits/stdc++.h>
#define int long long
#define pdd pair<double,double> 
#define x first
#define y second
using namespace std;

const int N=5010;
const double eps=1e-8;
int n;
pdd  q[N];
int stk[N];
int used[N];
pdd operator-(pdd a, pdd b){
  return {a.x-b.x,a.y-b.y};
}
double cross(pdd a,pdd b){
  return a.x*b.y-a.y*b.x;
}
double area(pdd a,pdd b,pdd c){
  return cross(b-a,c-a);
}
double get_dist(pdd a ,pdd b){
  double dx=a.x-b.x;
  double dy=a.y-b.y;
  return sqrt(dx*dx+dy*dy);
}
double andrew(){

  sort(q,q+n);
  int top=0;
  for(int i=0;i<n;i++){
    while(top>=2 && area(q[stk[top-2]],q[stk[top-1]],q[i])<=0){
      if(area(q[stk[top-2]],q[stk[top-1]],q[i])==0)
        top--;
      else
          used[stk[--top]]=false;
    }
    stk[top++]=i;
    used[i]=true;
  }  
  used[0]=false;
  for(int i=n-1;i>=0;i--){
    if(used[i]) continue;
    while(top>=2 && area(q[stk[top-2]],q[stk[top-1]],q[i])<=0)
      top--;
    stk[top++]=i; 
  }
      double  ans=0;
  for(int i=0;i<top;i++){
    int k=(i+2)%top;
    for(int j=i+1;j<top;j++){
      while(area(q[stk[i]],q[stk[j]],q[stk[k]])<
            area(q[stk[i]],q[stk[j]],q[stk[(k+1)%top]]))
          k=(k+1)%top;
      ans=max(ans,area(q[stk[i]],q[stk[j]],q[stk[k]]));
    }
   
  }


  return ans;
}
void solve(){
  cin>>n;
  for(int i=0;i<n;i++) cin>>q[i].x>>q[i].y;
  double ans=andrew();
   printf("%.5lf\n", ans/2);
} 

signed main(){
  int t=1;
  // cin>>t;
  while(t--)
  solve();
  return 0;
}
posted @ 2022-09-13 21:50  kingwzun  阅读(72)  评论(0编辑  收藏  举报