(hdu step 7.1.6)最大三角形(凸包的应用——在n个点中找到3个点,它们所形成的三角形面积最大)
题目:
最大三角形 |
Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) |
Total Submission(s): 121 Accepted Submission(s): 61 |
Problem Description
老师在计算几何这门课上给Eddy布置了一道题目。题目是这种:给定二维的平面上n个不同的点,要求在这些点里寻找三个点。使他们构成的三角形拥有的面积最大。
Eddy对这道题目百思不得其解,想不通用什么方法来解决,因此他找到了聪明的你,请你帮他解决这个题目。 |
Input
输入数据包括多组測试用例。每一个測试用例的第一行包括一个整数n。表示一共同拥有n个互不同样的点,接下来的n行每行包括2个整数xi,yi。表示平面上第i个点的x与y坐标。
你能够觉得:3 <= n <= 50000 并且 -10000 <= xi, yi <= 10000. |
Output
对于每一组測试数据,请输出构成的最大的三角形的面积。结果保留两位小数。
每组输出占一行。 |
Sample Input
3 |
Sample Output
1.50 |
Author
Eddy
|
Recommend
lcy
|
题目分析:
凸包的简单应用,在n个点中找到3个点,它们所形成的三角形面积最大。
这道题一般来说有两种思路:
1)直接暴力。这肯定会TLE,由于n的数据范围都在50000左右了。
2)先求凸包。
然后再在凸包上去找这三个点。这种话,数据规模就要小非常多了。事实证明,能形成最大三角形的
这三个点也一定在凸包上。
代码例如以下:
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm> using namespace std; /**
* 求n个点中随意三个点所形成的三角形的最大面积。
* 1)直接暴力。 肯定会TLE。 由于n都是50000多了。 *
* 2)所形成的最大三角形的三个点肯定在凸包上。 在凸包上找这三个点
* 将问题转化成:
* 在凸包上求三个点所形成的三角形的面积最大..
*/ const double epsi = 1e-8;
const double pi = acos(-1.0);
const int maxn = 50001; struct PPoint{//结构体尽量不要定义成Point这种,easy和C/C++本身中的变量同名
double x;
double y; PPoint(double _x = 0,double _y = 0):x(_x),y(_y){ } PPoint operator - (const PPoint& op2) const{
return PPoint(x - op2.x,y - op2.y);
} double operator^(const PPoint &op2)const{
return x*op2.y - y*op2.x;
}
}; inline int sign(const double &x){
if(x > epsi){
return 1;
} if(x < -epsi){
return -1;
} return 0;
} inline double sqr(const double &x){
return x*x;
} inline double mul(const PPoint& p0,const PPoint& p1,const PPoint& p2){
return (p1 - p0)^(p2 - p0);
} inline double dis2(const PPoint &p0,const PPoint &p1){
return sqr(p0.x - p1.x) + sqr(p0.y - p1.y);
} inline double dis(const PPoint& p0,const PPoint& p1){
return sqrt(dis2(p0,p1));
} int n;
PPoint p[maxn];
PPoint convex_hull_p0; inline bool convex_hull_cmp(const PPoint& a,const PPoint& b){
return sign(mul(convex_hull_p0,a,b)>0)|| (sign(mul(convex_hull_p0,a,b)) == 0 && dis2(convex_hull_p0,a) < dis2(convex_hull_p0,b));
} int convex_hull(PPoint* a,int n,PPoint* b){
int i;
for(i = 1 ; i < n ; ++i){
if(sign(a[i].x - a[0].x) < 0 || (sign(a[i].x - a[0].x) == 0 && sign(a[i].y - a[0].y) < 0)){
swap(a[i],a[0]);
}
} convex_hull_p0 = a[0];//这两行代码不要顺序调换了..否则会WA
sort(a,a+n,convex_hull_cmp); b[0] = a[0];
b[1] = a[1];
int newn = 2;
for(i = 2 ; i < n ; ++i){
while(newn > 1 && sign(mul(b[newn-1],b[newn-2],a[i])) >= 0){
newn--;
} b[newn++] = a[i];
} return newn;
} /**
* 有一个三角形的三个点来计算这个三角形的面积
*/
double crossProd(PPoint A, PPoint B, PPoint C) {
return (B.x-A.x)*(C.y-A.y) - (B.y-A.y)*(C.x-A.x);
} int main(){
while(scanf("%d",&n)!=EOF){
int i;
for(i = 0 ; i < n ; ++i){
scanf("%lf %lf",&p[i].x,&p[i].y);
} n = convex_hull(p,n,p);
p[n] = p[0]; double max_ans = -1; int j;
int k;
for(i = 0 ; i < n ; ++i){
for(j = i+1 ; j < n ; ++j){
for(k = j+1 ; k <= n ; ++k){
double ans = fabs(crossProd(p[i],p[j],p[k]))/2; if(max_ans < ans){
max_ans = ans;
}
}
}
} printf("%.2lf\n",max_ans);
} return 0;
}
(hdu step 7.1.6)最大三角形(凸包的应用——在n个点中找到3个点,它们所形成的三角形面积最大)的更多相关文章
- (hdu step 7.1.5)Maple trees(凸包的最小半径寻找掩护轮)
称号: Maple trees Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tot ...
- (hdu step 7.1.7)Wall(求凸包的周长——求将全部点围起来的最小凸多边形的周长)
题目: Wall Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Subm ...
- hdu 2202 最大三角形 (凸包)
最大三角形 Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submi ...
- hdu 最大三角形(凸包+旋转卡壳)
老师在计算几何这门课上给Eddy布置了一道题目,题目是这样的:给定二维的平面上n个不同的点,要求在这些点里寻找三个点,使他们构成的三角形拥有的面积最大.Eddy对这道题目百思不得其解,想不通用什么方法 ...
- HDU 4946 Area of Mushroom(构造凸包)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4946 题目大意:在一个平面上有n个点p1,p2,p3,p4....pn,每个点可以以v的速度在平面上移 ...
- HDU 1392 Surround the Trees(几何 凸包模板)
http://acm.hdu.edu.cn/showproblem.php?pid=1392 题目大意: 二维平面给定n个点,用一条最短的绳子将所有的点都围在里面,求绳子的长度. 解题思路: 凸包的模 ...
- HDU 3685 Rotational Painting(多边形质心+凸包)(2010 Asia Hangzhou Regional Contest)
Problem Description Josh Lyman is a gifted painter. One of his great works is a glass painting. He c ...
- (hdu step 7.1.3)Lifting the Stone(求凸多边形的重心)
题目: Lifting the Stone Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Other ...
- hdu 1348:Wall(计算几何,求凸包周长)
Wall Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
随机推荐
- quick-cocos2dx 之transition.execute()的缓动效果
注:本文图片来源(http://hosted.zeh.com.br/tweener/docs/en-us/misc/transitions.html. 侵权请告知,即刻删除) 什么是缓动, 缓动(ea ...
- spring4和hibernate4.0.0的整合
1.在myeclipse以下创建一个javaproject或者webproject,我创建的时webproject,用的myeclipse2013 2.导入spring的依赖包 3.导入hiberna ...
- Android慎用layout嵌套, 尽量控制在5层下面java.lang.StackOverflowError
一.探寻原因 在一个复杂的layout嵌套较多layout的android界面.在Android 2.3.内存较低 的机型上,出现 java.lang.StackOverflowError 这个Exc ...
- Ural 1152 False Mirrors(状压DP)
题目地址:space=1&num=1152">Ural 1152 初学状压DP,原来状压仅仅是用到了个位运算.. 非常水的状压DP.注意四则运算的优先级是高于位运算的..也就是 ...
- gemm() 与 gesvd() 到矩阵求逆(inverse)(根据 SVD 分解和矩阵乘法求矩阵的逆)
可逆方阵 A 的逆记为,A−1,需满足 AA−1=I. 在 BLAS 的各种实现中,一般都不会直接给出 matrix inverse 的直接实现,其实矩阵(方阵)的逆是可以通过 gemm()和gesv ...
- C#+HtmlAgilityPack+Dappe
C#+HtmlAgilityPack+Dappe (转发请注明来源:http://www.cnblogs.com/EminemJK/) 最近因为公司业务需要,又有机会撸winform了,这次的需求是因 ...
- Jquery validform
一.validform是什么? validform是一款智能的表单验证js插件,它是基于jQuery库与css,我们只需要把表单对象放入, 就可以对整个表 ...
- C#调用mmpeg进行各种视频转换的类实例
本文实例讲述了C#调用mmpeg进行各种视频转换的类.分享给大家供大家参考.具体如下: 这个C#类封装了视频转换所需的各种方法,基本上是围绕着如何通过mmpeg工具来进行视频转换 using Syst ...
- Android蓝牙2.0连接以及数据接收发送
1.加入权限 <uses-feature android:name="android.hardware.bluetooth_le" android:required=&quo ...
- WCF(三)IIS寄宿
WCF常用的一种使用方式是寄宿在IIS中. IIS寄宿操作流程如下: 1.创建IIS物理路径对应的文件夹,文件夹名称是WCFIIS. 2.在WCFIIS文件夹中添加文本文件,在文本文件中写入<% ...