题意:给N个点,求着N个点中选择三个联的最大的三角形面积!

注意精度:不然OJ上面会超时的

#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
const double eps = 1e-8;
using namespace std;
struct point
{
int x,y;
} p[50005],res[50005];
int cross(point p0, point p1, point p2)//计算叉积
{
return(p1.x- p0.x) * (p2.y- p0.y) - (p1.y- p0.y) * (p2.x- p0.x);
}//顺时针扫描,判断大于0(方向改变)的加入凸包,然后回溯
double dist(point a,point b)//两点距离
{
return sqrt((double)(a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
bool cmp(point a, point b)//按照y小到大排序,y相等按照x小到大排序
{
return(a.y< b.y|| (a.y== b.y&& a.x< b.x));
}
int Graham(int n)//求凸包,返回凸包上顶点的个数
{
int len, top=1;
sort(p, p+ n, cmp);
res[0] = p[0];
res[1] = p[1];
for(int i=2; i< n; i++)
{
while(top&& cross(res[top], res[top-1], p[i])<=eps)top--;
res[++ top] = p[i];
}
len= top;
res[++ top] = p[n-2];
for(int i= n-3; i>=0; i--)
{
while(top!= len&& cross(res[top], res[top-1], p[i])<=eps)top--;//注意精度问题,不然会超时的
res[++ top] = p[i];
}
return top;
}
int main()
{
int n,top;
while(scanf("%d",&n)!=EOF)
{
double MAX=-1;
for(int i=0; i<n; i++)
scanf("%d%d", &p[i].x ,&p[i].y);
top=Graham(n);
for(int i=0; i<top-2; i++)
for(int j=i+1; j<top-1; j++)
for(int k=j+1; k<top; k++)
{
double ss=fabs(cross(res[i],res[j],res[k]));
if(ss>MAX) MAX=ss;//暴力利用叉积计算三角形的面积
}
printf("%.2f\n",MAX/2.0);
}
return 0;
}

另一个版本的凸包

#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
const double eps = 1e-8;
using namespace std;
struct point
{
int x,y;
} p[50005],res[50005];
int cross(point p0, point p1, point p2)//计算叉积
{
return(p1.x- p0.x) * (p2.y- p0.y) - (p1.y- p0.y) * (p2.x- p0.x);
}//顺时针扫描,判断大于0(方向改变)的加入凸包,然后回溯
double dist(point a,point b)//两点距离
{
return sqrt((double)(a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
bool cmp(point a, point b)//极角排序,先用arctan()判断角大小,角度由小到大,然后用距离小到大排序
{
double t1 = atan2(a.y - p[0].y, a.x - p[0].x);
double t2 = atan2(b.y - p[0].y, b.x - p[0].x);
return t1>t2||(t1==t2&&dist(p[0],a)<dist(p[0],b));
}
int Graham(int n)//求凸包,返回凸包上顶点的个数
{
int len, top,tmp=0;
for(int i=1;i<n;i++)
if(p[tmp].y>p[i].y||(p[tmp].y==p[i].y&&p[tmp].x>p[i].x))
tmp=i;
swap(p[0],p[tmp]);//找出最左下角的点
sort(p+1, p+ n,cmp);
res[0] = p[0];
res[1] = p[1];
res[2] =p[2];
top=2;
for(int i=2; i<n; i++)
{
while(top>=2&& cross(res[top], res[top-1], p[i])<=eps)top--;
res[++ top] = p[i];
}//只用一次扫描
res[++top]=p[n-1];//完了要把最后一个点加上去
return top;
}
int main()
{
int n,top;
while(scanf("%d",&n)!=EOF)
{
double MAX=-1;
for(int i=0; i<n; i++)
scanf("%d%d", &p[i].x ,&p[i].y);
top=Graham(n);
for(int i=0; i<top-2; i++)
for(int j=i+1; j<top-1; j++)
for(int k=j+1; k<top; k++)
{
double ss=fabs(cross(res[i],res[j],res[k]));
if(ss>MAX) MAX=ss;//暴力利用叉积计算三角形的面积
}
printf("%.2f\n",MAX/2.0);
}
return 0;
}

凸包---HDU 2202的更多相关文章

  1. hdu 2202 最大三角形 (凸包)

    最大三角形 Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submi ...

  2. hdu 2202 最大三角形_凸包模板

    题意:略 思路:直接套用凸包模板 #include <iostream> #include <cstdio> #include <cmath> #include & ...

  3. HDU 2202 最大三角形(凸包)

    Problem Description 老师在计算几何这门课上给Eddy布置了一道题目,题目是这样的:给定二维的平面上n个不同的点,要求在这些点里寻找三个点,使他们构成的三角形拥有的面积最大.Eddy ...

  4. HDU 2202 计算几何

    最大三角形 Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submi ...

  5. HDU 2202 最大三角形

    题解:先算出凸包,然后枚举凸包上的点计算即可 #include <cstdio> #include <cmath> #include <cstdlib> #incl ...

  6. HDU题解索引

    HDU 1000 A + B Problem  I/O HDU 1001 Sum Problem  数学 HDU 1002 A + B Problem II  高精度加法 HDU 1003 Maxsu ...

  7. HDU 4946 Area of Mushroom(构造凸包)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4946 题目大意:在一个平面上有n个点p1,p2,p3,p4....pn,每个点可以以v的速度在平面上移 ...

  8. HDU 1392 凸包模板题,求凸包周长

    1.HDU 1392 Surround the Trees 2.题意:就是求凸包周长 3.总结:第一次做计算几何,没办法,还是看了大牛的博客 #include<iostream> #inc ...

  9. HDU 1392 Surround the Trees(凸包*计算几何)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1392 这里介绍一种求凸包的算法:Graham.(相对于其它人的解释可能会有一些出入,但大体都属于这个算 ...

随机推荐

  1. JavaScript 性能优化 --By Google V8 Team Manager

    原文:https://developers.google.com/v8/?hl=zh-CN Be Prepared before writing code[9:35] Understand how V ...

  2. STL&quot;源码&quot;剖析-重点知识总结

    STL是C++重要的组件之一,大学时看过<STL源码剖析>这本书,这几天复习了一下,总结出以下LZ认为比较重要的知识点,内容有点略多 :) 1.STL概述 STL提供六大组件,彼此可以组合 ...

  3. MFC知识点(DDX_Control 与 DDX_Text ,ON_COMMAND和ON_MESSAGE)

    1.DDX_Control 与 DDX_Text 区别 DDX_TEXT()的作用可以理解为把字符串变量和控件的文本(WindowText)关联起来, DDX_Control()的作用可以理解为把变量 ...

  4. 星星字体 ps教程

    本教程主要使用Photoshop制作绚丽星空装饰的艺术字教程,这个教程很简单,只需要一些简单技巧,即可做出海报.书籍杂志的封面效果.其中的字体.笔刷和背景均可以更换 教程所需要的素材链接:http:/ ...

  5. 使用ReflectionTestUtils解决依赖注入

    概述   当使用junit来测试Spring的代码时,为了减少依赖,需要给对象的依赖,设置一个mock对象,但是由于Spring可以使用@Autoware类似的注解方式,对私有的成员进行赋值,此时无法 ...

  6. dom 表格操作

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  7. 事件委托(event delegation)

    事件委托给我带来的第一印象是,如果可以的话请尝试得经常使用它,性能好! 通过字符串拼接后,并进行DOM插入,不会复制事件,此时需要进行事件委托了!!! 优点 事件委托对于web应用程序的性能有如下几个 ...

  8. ICON的设计很重要

    ICON的设计很重要 发布者: wuye | 发布时间: 2014-12-19 17:45| 评论数: 0 游戏类型:手游游戏/平板游戏  设计类型:[功能/模块/UI] 作者:小金狮的UI分享 每个 ...

  9. JavaScript面向对象简介

    JavaScript面向对象简介 @(编程) [TOC] 1. 命名空间 命名空间是一个容器,它允许开发人员在一个独特的,特定于应用程序的名称下捆绑所有的功能. 在JavaScript中,命名空间只是 ...

  10. Angular 中得 scope 作用域梳理

    $scope 的使用贯穿整个 Angular App 应用,它与数据模型相关联,同时也是表达式执行的上下文.有了 $scope 就在视图和控制器之间建立了一个通道,基于作用域视图在修改数据时会立刻更新 ...