nyoj 952 最大四边形 计算几何 转载
2014-04-21 15:48
211 查看
事实再一次证明:本小菜在计算几何上就是个渣啊,唉,,,
题意:平面上n个点(n<=300),问任意四个点组成的四边形(保证四条边不相交)的最大面积是多少。
分析:
原文地址
1、第一思路是枚举四个点,以O(n4)的算法妥妥超时。
2、以下思路源自官方题解
以O(n2)枚举每一条边,以这条边作为四边形的对角线(注意:这里所说的 对角线是指把四边形分成两部分的线,不考虑凹四边形可能出现的两个点在对角线同一侧的情况),以O(n)枚举每一个点,判断是在对角线所在直线的左侧还是 右侧。因为被对角线分割开的两三角形不相关,所以可以单独讨论:分别找出左右两侧的最大三角形,二者之和即为此边对应的最大四边形。整个算法为 O(n3)。
3、何为叉积?
百度百科“叉积”解释的很详细,这里用到两条:
一、axb 表示的是一个符合右手法则的、垂直于a、b的向量c,|c|=|a|*|b|*sinθ,θ指向量a,b的夹角,即|c|是以a、b为边的平行四边形的面积——已知3点A,B,C,|BAxCA|==S(三角形ABC)*2。
二、坐标表示法中,a(x1,y1),b(x2,y2)。c=axb=x1*y2-x2*y1,c的正负表示方向,正为上、负为下。而在三维中,方向不能简单的以正负表示,所以只能以一个向量的形式来描述:
| i , j , k |
|x1,y1,z1|
|x2,y2,z2| i,j,k分别表示x轴、y轴、z轴上的单位向量,矩阵的解也就是c=axb。
这里只是二维平面,判断点在向量所在直线的哪一侧,就可以利用叉积的方向来区别。对角线AB,两侧各取一点C、D,必然有CAxCB=-DAxDB。
注意:一开始不知道叉积的模即是三角形面积的两倍,就用axb=|a|*|b|*cosθ推S=|a|*|b|*sinθ,跑到第八组数据就超时了,纠结了好久,后来发现,原来每个三角形是在O(n3)的复杂度下求解的,多算一步就多一个O(n3),TLE的不冤T^T;
代码:
题意:平面上n个点(n<=300),问任意四个点组成的四边形(保证四条边不相交)的最大面积是多少。
分析:
原文地址
1、第一思路是枚举四个点,以O(n4)的算法妥妥超时。
2、以下思路源自官方题解
以O(n2)枚举每一条边,以这条边作为四边形的对角线(注意:这里所说的 对角线是指把四边形分成两部分的线,不考虑凹四边形可能出现的两个点在对角线同一侧的情况),以O(n)枚举每一个点,判断是在对角线所在直线的左侧还是 右侧。因为被对角线分割开的两三角形不相关,所以可以单独讨论:分别找出左右两侧的最大三角形,二者之和即为此边对应的最大四边形。整个算法为 O(n3)。
3、何为叉积?
百度百科“叉积”解释的很详细,这里用到两条:
一、axb 表示的是一个符合右手法则的、垂直于a、b的向量c,|c|=|a|*|b|*sinθ,θ指向量a,b的夹角,即|c|是以a、b为边的平行四边形的面积——已知3点A,B,C,|BAxCA|==S(三角形ABC)*2。
二、坐标表示法中,a(x1,y1),b(x2,y2)。c=axb=x1*y2-x2*y1,c的正负表示方向,正为上、负为下。而在三维中,方向不能简单的以正负表示,所以只能以一个向量的形式来描述:
| i , j , k |
|x1,y1,z1|
|x2,y2,z2| i,j,k分别表示x轴、y轴、z轴上的单位向量,矩阵的解也就是c=axb。
这里只是二维平面,判断点在向量所在直线的哪一侧,就可以利用叉积的方向来区别。对角线AB,两侧各取一点C、D,必然有CAxCB=-DAxDB。
注意:一开始不知道叉积的模即是三角形面积的两倍,就用axb=|a|*|b|*cosθ推S=|a|*|b|*sinθ,跑到第八组数据就超时了,纠结了好久,后来发现,原来每个三角形是在O(n3)的复杂度下求解的,多算一步就多一个O(n3),TLE的不冤T^T;
代码:
#include <iostream> #include <math.h> #include <algorithm> #include <stdio.h> #include <string.h> using namespace std; #define eps 1e-10 #define maxn 310 typedef struct point{ double x,y; }p; p Point[maxn]; double cross(point p1,point p2,point p0){ return ((p1.x-p0.x)*(p2.y-p0.y)-(p1.y-p0.y)*(p2.x-p0.x))*0.5; } double max(double a,double b){ if(a>b) return a; return b; } int main() { int n; while(~scanf("%d",&n)){ for(int i=0;i<n;i++) scanf("%lf %lf",&Point[i].x,&Point[i].y); double ans=0,lmax=0,rmax; for(int i=0;i<n;i++){ for(int j=i+1;j<n;j++){ rmax=0,lmax=0; for(int k=0;k<n;k++){ if(k!=i && k!=j){ double s=cross(Point[i],Point[j],Point[k]); if(s<eps){ lmax=max(lmax,-s); } else{ rmax=max(rmax,s); } } } if(lmax==0 || rmax==0)continue; ans=max(ans,(rmax+lmax)); } } printf("%lf\n",ans); } return 0; }
相关文章推荐
- nyoj 952 : 最大四边形 (计算几何)
- NYOJ 题目952 最大四边形(几何,技巧)
- nyoj 最大四边形 952 (数学几何+技巧) 好题
- nyoj952最大四边形 思路+代码
- 【ZOJ3919 2016年浙大2月月赛E】【简单计算几何 贪心】Ellipse 椭圆内切圆外切平行四边形最大最小面积
- nyoj 952 最大四边形
- NYOJ952--最大四边形--叉积分成三角形
- NYOJ 952 最大四边形
- nyoj952最大四边形
- nyoj952——最大四边形
- nyoj952 最大四边形(叉乘+技巧)
- 计算几何 求n个点中最大四边形
- nyoj-253-LK的旅行(计算几何-凸包)
- 【BZOJ1069】【SCOI2007】最大土地面积 计算几何 凸包
- nyoj-83 迷宫寻宝(二) (计算几何)
- nyoj_3:多边形重心问题(计算几何)
- [BZOJ]1069: [SCOI2007]最大土地面积 计算几何
- 【计算几何】最大土地面积
- BZOJ 1069 [SCOI2007]最大土地面积 ——计算几何
- NYOJ-多边形重心问题(计算几何)