凸包---HDU 2202
题意:给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的更多相关文章
- hdu 2202 最大三角形 (凸包)
最大三角形 Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submi ...
- hdu 2202 最大三角形_凸包模板
题意:略 思路:直接套用凸包模板 #include <iostream> #include <cstdio> #include <cmath> #include & ...
- HDU 2202 最大三角形(凸包)
Problem Description 老师在计算几何这门课上给Eddy布置了一道题目,题目是这样的:给定二维的平面上n个不同的点,要求在这些点里寻找三个点,使他们构成的三角形拥有的面积最大.Eddy ...
- HDU 2202 计算几何
最大三角形 Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submi ...
- HDU 2202 最大三角形
题解:先算出凸包,然后枚举凸包上的点计算即可 #include <cstdio> #include <cmath> #include <cstdlib> #incl ...
- HDU题解索引
HDU 1000 A + B Problem I/O HDU 1001 Sum Problem 数学 HDU 1002 A + B Problem II 高精度加法 HDU 1003 Maxsu ...
- HDU 4946 Area of Mushroom(构造凸包)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4946 题目大意:在一个平面上有n个点p1,p2,p3,p4....pn,每个点可以以v的速度在平面上移 ...
- HDU 1392 凸包模板题,求凸包周长
1.HDU 1392 Surround the Trees 2.题意:就是求凸包周长 3.总结:第一次做计算几何,没办法,还是看了大牛的博客 #include<iostream> #inc ...
- HDU 1392 Surround the Trees(凸包*计算几何)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1392 这里介绍一种求凸包的算法:Graham.(相对于其它人的解释可能会有一些出入,但大体都属于这个算 ...
随机推荐
- Anychart 破解备注
由于项目里用到anychart组件,第一次破解了,后来升级再破解时忘了方法,所以在这里备注一下. 首先需要的工具: swfc (http://www.buraks.com/swifty/swfc.h ...
- 二.JSP开发过程中遇到的问题及解决
一.开发环境问题 问题一:Failed to load the JNI shared library 启动Eclipse时弹出“Failed to load the JNI shared librar ...
- Camel In Action 阅读笔记 第一部分概述 + 第一章概述 认识Camel
第一部分: 最开始的一小步 Apache Camel 是一个开源集成框架,其目的是让系统集成变得更加简便,在本书的第一章中,我们会为您介绍它并向您展示它是如何在大型企业应用中做好集成工作.您也会了解到 ...
- linux常用的一些命令(不断增加中)
linux 下重启 apache: httpd -k restart 下面这些大多命令都可以在<鸟哥私房菜>的服务器中的“常用网络指令”和基础中的“程序与资源管理”中找到ps -aux 这 ...
- 谈FTP服务器攻击技术及其展望 (下)
上篇回顾:谈FTP服务器攻击技术及其展望 (上)http://chenguang.blog.51cto.com/350944/436876 本文出自 "李晨光原创技术博 ...
- 转】MyEclipse使用总结——MyEclipse10安装SVN插件
原博文出自于: http://www.cnblogs.com/xdp-gacl/p/3497016.html 感谢! 一.下载SVN插件subclipse 下载地址:http://subclipse. ...
- HDU 5867 Water problem (模拟)
Water problem 题目链接: http://acm.split.hdu.edu.cn/showproblem.php?pid=5867 Description If the numbers ...
- poj 2239 Selecting Courses(二分匹配简单模板)
http://poj.org/problem?id=2239 这里要处理的是构图问题p (1 <= p <= 7), q (1 <= q <= 12)分别表示第i门课在一周的第 ...
- linux极点五笔无法输入词组_ibus设置
菜鸟学linux——用的是ubuntu 不知道是不是按个哪些快捷键,极点五笔突然无法输入词组.那个抓狂啊 没关系,设置一下就ok 第一步:右上角输入法,右键——>首选项——>常规——> ...
- Python输入输出(IO)
程序会有输入和输出,输入可以从标准输入或是从一个文件读入数据,程序的输出可以以一种友好可读的方式(human-readable)打印出来,或是写进一个文件,而标准输入和标准输出(键盘和显示器)在程序的 ...