事实再一次证明:本小菜在计算几何上就是个渣= =

题意:平面上n个点(n<=300),问任意四个点组成的四边形(保证四条边不相交)的最大面积是多少。

分析:

1、第一思路是枚举四个点,以O(n4)的算法妥妥超时。

2、以下思路源自官方题解

  以O(n2)枚举每一条边,以这条边作为四边形的对角线(注意:这里所说的对角线是指把四边形分成两部分的线,不考虑凹四边形可能出现的两个点在对角线同一侧的情况),以O(n)枚举每一个点,判断是在对角线所在直线的左侧还是右侧。因为被对角线分割开的两三角形不相关,所以可以单独讨论:分别找出左右两侧的最大三角形,二者之和即为此边对应的最大四边形。整个算法为O(n3)。

3、何为叉积?

  百度百科“叉积”解释的很详细,这里用到两条:

  一、axb 表示的是一个符合右手法则的、垂直于ab的向量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<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#define rep(i,a,b) for(int i=a;i<=b;i++)
using namespace std; const int MAXN=;
const double eps=1e-; struct Point{
double x,y;
Point(double _x=,double _y=):x(_x),y(_y){}
}p[MAXN]; typedef Point Vector; 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)*0.5;
} int main()
{
int n;
scanf("%d",&n);
rep(i,,n){
scanf("%lf%lf",&p[i].x,&p[i].y);
}
double ans=;
rep(i,,n){
rep(j,i+,n){
double lmax,rmax;
lmax=rmax=;
rep(k,,n){
if(k==i||k==j)
continue;
double s=cross(p[i]-p[k],p[j]-p[k]);
if(s<eps)
lmax=max(lmax,-s);
else
rmax=max(rmax,s);
}
if(lmax==||rmax==)
continue;
ans=max(ans,lmax+rmax);
}
}
printf("%f\n",ans);
return ;
}

最新文章

  1. maven repo plugin archiver
  2. PHP错误级别 error_reporting() 函数详解
  3. FFmpeg官方文档之————先进音频编码(AAC)
  4. js加密解密
  5. 修改Broforce无限人数,死亡不减反加
  6. 使用BroadcastReceiver实现系统对手机电量进行提示
  7. Shell学习笔记 - 分支语句
  8. 【POJ】2001 Shortest Prefixes
  9. ng-if和ng-show的区别
  10. js split函数用法总结
  11. 每天收获一点点------Hadoop之HDFS基础入门
  12. 纪中集训 Day 0?
  13. ionic接入广告
  14. cpp(第四章)
  15. JSP入门 导出文件
  16. WPF MVVM模式的一些理解
  17. codeforces#1136E. Nastya Hasn&#39;t Written a Legend(二分+线段树)
  18. tomcat发布项目如何通过域名直接访问
  19. Java 容器 &amp; 泛型:三、HashSet,TreeSet 和 LinkedHashSet比较
  20. Ubuntu 分辨率显示出错,分辨率不是最佳分辨率的解决办法

热门文章

  1. mq_close
  2. 关于 RTMP RTMPT RTMPS RTMPE RTMPTE RTMFP AMF 简介
  3. 【web性能】js应该放在html页面的什么位置
  4. SQL Server 高性能写入的一些总结
  5. jsp %EF%BB%BF
  6. Maven Project configuration is not up-to-date with pom.xml错误解决方法
  7. kettle的jdk1.7环境变量配置
  8. Getting Error &quot;Invalid Argument to LOCATOR.CONTROL: ORG_LOCATOR_CONTROL=&#39;&#39; in Material Requirements Form (文档 ID 1072379.1)
  9. Back to Back Order Process
  10. JAVA反射技术的使用