半路进军的ACMer一枚 | 医学杂交研究生|

kingwzun

园龄:3年6个月粉丝:111关注:0

2022-09-13 21:50阅读: 81评论: 0推荐: 0

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

题目

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

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

思路:

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

代码:

#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;
}

本文作者:kingwzun

本文链接:https://www.cnblogs.com/kingwz/p/16691036.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   kingwzun  阅读(81)  评论(0编辑  收藏  举报
历史上的今天:
2021-09-13 vector用法
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起