日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

poj2079(一堆点找出最大的三角形)

發布時間:2025/3/15 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 poj2079(一堆点找出最大的三角形) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題意:

給出n個二維坐標點,找出三個點,它們組成的三角形面積最大。


思路:

首先,面積最大的三角形的三個點一定在凸包上,我們先求所有點的凸包,然后選擇一個邊i、j,枚舉k,找到一個最大的面積,然后定下i,枚舉j和k,找到最大的面積。

pojG++是坑!


代碼:

#include<cstdio> #include<cstring> #include<cmath> #include<cstdlib> #include<iostream> #include<algorithm> #include<queue> #include<stack> #include<set> #include<vector> #include<string>#define EPS 1e-10 #define MAXN 50100using namespace std;struct point {double x,y;point(){}point(double tx,double ty):x(tx),y(ty){}point(const point &tt){x=tt.x;y=tt.y;} }; point data[MAXN]; point convex[MAXN]; point start(0,0);inline double cross(const point &p1,const point &p2,const point &q1,const point &q2) {return (q2.y-q1.y)*(p2.x-p1.x)-(q2.x-q1.x)*(p2.y-p1.y); }inline bool cmp1(const point &a,const point &b) {if(a.y==b.y)return a.x<b.x;return a.y<b.y; }inline bool cmp2(const point &a,const point &b)//逆時針排序 {point origin;origin=start;return cross(origin,a,origin,b)>0||(cross(origin,a,origin,b)==0&&fabs(a.x)<fabs(b.x)); }inline void convex_hull(int &cnt,int n) {sort(data,data+n,cmp1);start=data[0];sort(data+1,data+n,cmp2);convex[cnt++]=start;convex[cnt++]=data[1];for(int i=2;i<n;++i) {while(cnt>=2&&cross(convex[cnt-2],convex[cnt-1],convex[cnt-1],data[i])<=0)--cnt;convex[cnt++]=data[i]; } }inline double rotating_calipers(int n) {int j=1,k=0;double area=0;for(int i=0;i<n;++i) {j=(i+1)%n;k=(j+1)%n;while(fabs(cross(convex[i],convex[j],convex[i],convex[k]))< fabs(cross(convex[i],convex[j],convex[i],convex[(k+1)%n])))k=(k+1)%n; while(j!=i&&k!=i) {area=max(area,fabs(cross(convex[i],convex[j],convex[i],convex[k])));while(fabs(cross(convex[i],convex[j],convex[i],convex[k]))<fabs(cross(convex[i],convex[j],convex[i],convex[(k+1)%n])))k=(k+1)%n; j=(j+1)%n; }}return area; }int main() {int n;while(scanf("%d",&n)!=EOF){if(n==-1)break;for(int i=0;i<n;i++)scanf("%lf%lf",&data[i].x,&data[i].y);if(n<=2){printf("0.00\n");continue;}int cnt=0;convex_hull(cnt,n);if(cnt<=2)printf("0.00\n");else{if(cnt==3)printf("%.2lf\n",fabs(cross(convex[0],convex[1],convex[0],convex[2]))/2);else printf("%.2lf\n",rotating_calipers(cnt)/2);}}return 0; }

總結

以上是生活随笔為你收集整理的poj2079(一堆点找出最大的三角形)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。