平面最大三角形面积 Largest Triangle Kattis - largesttriangle
题意:
给定一些点,求出任选三点的最大三角形面积
题解:
首先想到最大的面积应该出现在凸包上。(应该很好猜)
思路:
- 暴力枚举凸包上的任意两点,
- (这个过程不太好描述,看代码ba)可以想到,第三个点是单向的(也就是下标只会增加),
因此复杂度是:
代码:
#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 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
2021-09-13 vector用法