【凸包】HDU2202最大三角形
来源:互联网 发布:手机淘宝首页装修布局 编辑:程序博客网 时间:2024/05/18 03:04
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2202
Problem Description
老师在计算几何这门课上给Eddy布置了一道题目,题目是这样的:给定二维的平面上n个不同的点,要求在这些点里寻找三个点,使他们构成的三角形拥有的面积最大。
Eddy对这道题目百思不得其解,想不通用什么方法来解决,因此他找到了聪明的你,请你帮他解决这个题目。
Eddy对这道题目百思不得其解,想不通用什么方法来解决,因此他找到了聪明的你,请你帮他解决这个题目。
Input
输入数据包含多组测试用例,每个测试用例的第一行包含一个整数n,表示一共有n个互不相同的点,接下来的n行每行包含2个整数xi,yi,表示平面上第i个点的x与y坐标。你可以认为:3 <= n <= 50000 而且 -10000 <= xi, yi <= 10000.
Output
对于每一组测试数据,请输出构成的最大的三角形的面积,结果保留两位小数。
每组输出占一行。
每组输出占一行。
Sample Input
33 42 63 762 63 92 08 06 67 7
Sample Output
1.5027.00
代码:
#include<iostream>#include<cstring>#include<string>#include<cmath>#include<algorithm>#include<cstdio>#include<iomanip>using namespace std;int n; //int top=0; // 记录凸包中点的个数;struct node{ int x,y;}p[50005],ans[50005];// 计算两点之间的距离;double Distance(node A,node B){ return sqrt((A.x-B.x)*(A.x-B.x)*1.0+(A.y-B.y)*(A.y-B.y)*1.0);}// 判断p2的斜率比p1的斜率大还是小;int multiply(node p0,node p1,node p2){ return (p2.x-p0.x)*(p1.y-p0.y)-(p1.x-p0.x)*(p2.y-p0.y);}// 自定义排序;bool cmp(node a,node b){ int m=multiply(p[0],a,b); if(m) return m<0; else if(m==0) return Distance(p[0],a)>Distance(p[0],b);}void Graham(){ ans[0]=p[0]; ans[1]=p[1]; ans[2]=p[2]; top=2; for(int i=3;i<=n;i++){ while(multiply(ans[top-1],ans[top],p[i])>0) top--; ans[++top]=p[i]; }}double S(node a,node b,node c){ double aa=Distance(b,c); double bb=Distance(a,c); double cc=Distance(b,a); double p=(aa+bb+cc)/2.0; return sqrt(p*(p-aa)*(p-bb)*(p-cc));}int main(){ while(cin>>n){ cin>>p[0].x>>p[0].y; node tmp=p[0]; int t=0; for(int i=1;i<n;i++){ cin>>p[i].x>>p[i].y; // 查找起始点,y值最小的点; if(tmp.y>p[i].y){ t=i; tmp=p[i]; }else if(tmp.y==p[i].y&&tmp.x>p[i].x){ t=i; tmp=p[i]; } } swap(p[t],p[0]); sort(p+1,p+n,cmp); // 按斜率排序; p[n]=tmp; Graham(); double maxS=0; for(int i=0;i<top-1;i++){ for(int j=i+1;j<=top;j++){ for(int k=j+1;k<=top;k++){ maxS=max(maxS,S(ans[i],ans[j],ans[k])); } } } cout<<fixed<<setprecision(2)<<maxS<<endl; } return 0;}
0 0
- 【凸包】HDU2202最大三角形
- hdu2202 最大三角形 凸包
- HDU2202最大三角形
- 计算几何——最大三角形【HDU2202】
- hdu2202 最大三角形(旋转卡壳)
- hdu2202 凸包+旋转卡壳
- 最大三角形(凸包)
- hdoj 2202 最大三角形 (凸包)
- HDU 2202 最大三角形 【凸包+枚举】
- HDU2202
- hdu2202
- HDOJ 2202 最大三角形 凸包旋转卡壳求最大三角形面积
- pku 2079 最大三角形 (凸包)(目前TLE)
- hdu 2202 最大三角形(凸包模板)
- hdu 2202 最大三角形 凸包+向量积
- POJ 2079 Triangle (凸包中的最大三角形&旋转卡壳)
- hdu 2202 最大三角形_凸包模板
- POJ 2079 凸包最大内接三角形
- Swift笔记:函数
- 如何在i.mx6dl开发板上移植udev并实现移动设备的自动挂载
- sqlserver2014自动安装
- 树莓派瞎玩~9~dns服务器
- 个人对webdriver的理解(一)
- 【凸包】HDU2202最大三角形
- android 图片压缩
- C++ STL编程轻松入门(1)
- js中confirm()函数的用法
- android 屏幕适配
- SGU 125 Shtirlits(dfs)
- 用栈判断表达式中的括号是否匹配
- 稀疏矩阵,用vector,实现抽象类
- 个人对webdriver的理解(二)