POJ 2079 Triangle(凸包+旋转卡壳,求最大三角形面积)
来源:互联网 发布:vm安装mac os 编辑:程序博客网 时间:2024/06/04 23:32
POJ 2079 Triangle(凸包+旋转卡壳,求最大三角形面积)
题目链接:http://poj.org/problem?id=2079
题意:
给出n个点,求有三个点组成的三角形中,最大的面积。
分析:
先求凸包,早用旋转卡壳求差积的绝对值最大值,三角形的面积等于差积的绝对值的一半。
#include<cstdio>#include<cstring>#include<cmath>#include<algorithm>#include<iostream>using namespace std;const double eps=1e-10;int dcmp(double x){ if(fabs(x)<eps) return 0; return x<0?-1:1;}struct Point{ double x,y; Point(){} Point(double x,double y):x(x),y(y){} bool operator<(const Point &B)const { return dcmp(x-B.x)<0 || (dcmp(x-B.x)==0 && dcmp(y-B.y)<0 ); } bool operator==(const Point &B)const { return dcmp(x-B.x)==0 && dcmp(y-B.y)==0; }};typedef Point Vector;Vector operator-(Point A,Point B){ return Vector(A.x-B.x,A.y-B.y);}Vector operator+(Vector A,Vector B){ return Vector(A.x+B.x,A.y+B.y);}double Cross(Vector A,Vector B)//向量差积{ return A.x*B.y-A.y*B.x;}Vector Rotate(Vector A,double rad){ return Vector(A.x*cos(rad)-A.y*sin(rad), A.x*sin(rad)+A.y*cos(rad));}int ConvexHull(Point *p,int n,Point *ch)//求凸包{ sort(p,p+n); n=unique(p,p+n)-p;//去重 int m=0; for(int i=0;i<n;++i) { while(m>1 && Cross(ch[m-1]-ch[m-2], p[i]-ch[m-2])<=0 ) --m; ch[m++]=p[i]; } int k=m; for(int i=n-2;i>=0;i--) { while(m>k && Cross(ch[m-1]-ch[m-2], p[i]-ch[m-2])<=0) --m; ch[m++]=p[i]; } if(n>1) m--; return m;}double dist2(Point a,Point b){return (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y);}/***以上为刘汝佳模板***/const int maxn=50000+5;Point P[maxn];Point p[maxn];//旋转卡壳,求两点间距离平方的最大值double rotating_calipers(Point p[],int n){ double ans = 0; Point v; int cur = 1; for(int i = 0;i < n;i++) { int j = (i+1)%n; int k = (j+1)%n; while(j != i && k != i) { //abs((p[j]-p[i])^(p[k]-p[i])) 是由i,j,k三点组成的三角形的面积 ans = max(ans,abs( Cross(p[j]-p[i],p[k]-p[i]) ) ); while( ( Cross(p[i]-p[j],p[(k+1)%n]-p[k]) ) < 0 ) k = (k+1)%n; j = (j+1)%n; } } return ans;}int main(){ int n; while(scanf("%d",&n) == 1) { if(n==-1)break; for(int i = 0;i < n;i++) scanf("%lf%lf",&p[i].x,&p[i].y); int m=ConvexHull(p,n,P);printf("%.2lf\n",rotating_calipers(P,m)/2); } return 0;}
阅读全文
0 0
- POJ 2079 Triangle(凸包+旋转卡壳求最大三角形面积)
- POJ 2079 Triangle(凸包+旋转卡壳,求最大三角形面积)
- POJ 2079 Triangle(凸包_旋转卡壳之最大三角形面积)
- POJ 2079 求最大三角形面积 (凸包+旋转卡壳)
- ZOJ 2419-- Triangle-凸包+旋转卡壳求最大面积三角形(计算几何)
- POJ 2079 Triangle (凸包中的最大三角形&旋转卡壳)
- POJ 2079 旋转卡壳求最大三角形面积
- POJ 2079 Triangle(旋转卡壳计算平面点集最大三角形面积)
- POJ 2079 Triangle (平面点最大三角形 凸包+旋转卡壳 推荐)
- HDOJ 2202 最大三角形 凸包旋转卡壳求最大三角形面积
- poj 2079 Triangle,旋转卡壳求点集的最大三角形
- POJ 2079 Triangle 凸包+旋转卡壳
- poj 2079 Triangle 凸包+旋转卡壳
- poj 2079 Triangle(凸包+旋转卡壳)
- POJ 2079 Triangle(凸包-旋转卡壳)
- poj 2079 Triangle (二维凸包旋转卡壳)
- HDU 2202 最大三角形 (凸包+旋转卡壳)
- poj2079 Triangle (旋转卡壳之最大三角形)
- 线性表的基本操作实现及其应用之顺序表的建立与操作实现
- MySQL架构与概念
- codevs 1082 线段树练习 3(区间修改+区间求和)
- 【DDD】领域驱动设计实践 —— 业务建模小招数
- 在MFC中选择要打开文件的路径
- POJ 2079 Triangle(凸包+旋转卡壳,求最大三角形面积)
- java中的堆和栈空间
- django ajax上传文件
- 头文件#include<bits/stdc++.h>
- babel+browserify用法总结
- Java 坑
- node+mongodb建站攻略(1)
- 通信
- c# 从一个大图里截取图形