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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

HDU 2202 计算几何

發布時間:2023/11/29 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 HDU 2202 计算几何 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

最大三角形

Time Limit: 5000/2000 MS (Java/Others)????Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 4015????Accepted Submission(s): 1433


Problem Description 老師在計算幾何這門課上給Eddy布置了一道題目,題目是這樣的:給定二維的平面上n個不同的點,要求在這些點里尋找三個點,使他們構成的三角形擁有的面積最大。
Eddy對這道題目百思不得其解,想不通用什么方法來解決,因此他找到了聰明的你,請你幫他解決這個題目。

?

Input 輸入數據包含多組測試用例,每個測試用例的第一行包含一個整數n,表示一共有n個互不相同的點,接下來的n行每行包含2個整數xi,yi,表示平面上第i個點的x與y坐標。你可以認為:3 <= n <= 50000 而且 -10000 <= xi, yi <= 10000.

?

Output 對于每一組測試數據,請輸出構成的最大的三角形的面積,結果保留兩位小數。
每組輸出占一行。

?

Sample Input 3 3 4 2 6 3 7 6 2 6 3 9 2 0 8 0 6 6 7 7

?

Sample Output 1.50 27.00

?

Author Eddy 代碼: 1 //最大三角形的頂點一定是凸包的頂點,先求凸包再三重循環用向量算最大的三角形面積。剛開始以為這樣會超時竟然沒有 2 #include<iostream> 3 #include<cstdio> 4 #include<cstring> 5 #include<algorithm> 6 #include<cmath> 7 using namespace std; 8 int n,top; 9 struct nod 10 { 11 double x,y; 12 }p[50004],que[50004]; 13 int xy(nod p0) 14 { 15 p0.x-=p[0].x; 16 p0.y-=p[0].y; 17 if(p0.x>=0&&p[0].y>=0) return 1; 18 if(p[0].x<=0&&p[0].y>0) return 2; 19 if(p[0].x<0&&p[0].y<=0) return 3; 20 if(p[0].x>=0&&p[0].y<0) return 4; 21 } 22 double chaji(nod p0,nod p1,nod p2) 23 { 24 return ((p1.x-p0.x)*(p2.y-p0.y)-(p1.y-p0.y)*(p2.x-p0.x)); 25 } 26 bool cmp(nod p1,nod p2) 27 { 28 int L1=xy(p1),L2=xy(p2); 29 if(L1==L2) 30 { 31 double tem=chaji(p[0],p1,p2); 32 if(tem>0) return 1; 33 if(tem<0) return 0; 34 if(tem==0) 35 return p1.x<p2.x; 36 } 37 else return L1<L2; 38 } 39 void tubao() 40 { 41 top=0; 42 que[top].x=p[0].x;que[top++].y=p[0].y; 43 que[top].x=p[1].x;que[top++].y=p[1].y; 44 que[top].x=p[2].x;que[top].y=p[2].y; 45 for(int i=3;i<=n;i++) 46 { 47 while(chaji(que[top-1],que[top],p[i])<=0) 48 top--; 49 que[++top].x=p[i].x; 50 que[top].y=p[i].y; 51 } 52 } 53 int main() 54 { 55 while(scanf("%d",&n)!=EOF) 56 { 57 double Minx=10000007,Miny=10000007; 58 int Mini; 59 for(int i=0;i<n;i++) 60 { 61 scanf("%lf%lf",&p[i].x,&p[i].y); 62 if(p[i].y<Miny) 63 { 64 Miny=p[i].y; 65 Minx=p[i].x; 66 Mini=i; 67 } 68 else if(p[i].y==Miny&&p[i].x<Minx) 69 { 70 Minx=p[i].x; 71 Mini=i; 72 } 73 } 74 if(n==1||n==2) 75 { 76 printf("0.00\n"); 77 continue; 78 } 79 double tem=p[0].x; 80 p[0].x=p[Mini].x; 81 p[Mini].x=tem; 82 tem=p[0].y; 83 p[0].y=p[Mini].y; 84 p[Mini].y=tem; 85 sort(p+1,p+n,cmp); 86 p[n].x=p[0].x;p[n].y=p[0].y; 87 tubao(); 88 double ans=0.0; 89 for(int i=0;i<=top-2;i++) 90 for(int j=i+1;j<=top-1;j++) 91 for(int k=j+1;k<=top;k++) 92 { 93 ans=max(fabs(chaji(que[i],que[j],que[k])),ans); 94 } 95 printf("%.2lf\n",ans/2); 96 } 97 return 0; 98 }

?

轉載于:https://www.cnblogs.com/--ZHIYUAN/p/6080780.html

總結

以上是生活随笔為你收集整理的HDU 2202 计算几何的全部內容,希望文章能夠幫你解決所遇到的問題。

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