HDU 2202 最大三角形

最大三角形

Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 3248    Accepted Submission(s): 1098

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
3 4
2 6
3 7
6
2 6
3 9
2 0
8 0
6 6
7 7

Sample Output

1.50
27.00

给你 n 个点 然后求其中三个点形成的三角形面积最大为多少 。

解法就是求一个凸包 , 然后 n^3 枚举凸包栈里面的点求一下向量叉积就过了 -。-

#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;

typedef pair<double,double> Point;

const int N = 50010 ;
//#define x first
//#define y second
//vector<Point>ch , p;
int n ;

struct node
{
    double x , y ;
    node(){};
    node( double a ,double b ){ x = a , y = b ; }
    node operator - (const node &a )const{ return node(x - a.x , y - a.y ); }

}p[N] , ch[N];
inline double Cross( node a , node b ){ return a.x * b.y - a.y * b.x ; }
inline bool cmp ( const node &a ,const node &b ){ if(a.x != b.x )return a.x < b.x ; else return a.y < b.y ; }

int ConvexHull()
{
    int  top = 0 ;
    sort( p , p + n , cmp );
    for( int i = 0 ; i < n ; ++ i ){
        while( top > 1 && Cross( ch[top-2] - ch[top-1] , p[i] - ch[top-2 ] ) <= 0  ) top -- ;
        ch[top++] = p[i];
    }
    int k = top ;
    for( int i = n-2 ; i >= 0 ; --i ){
        while( top > k && Cross( ch[top-2] - ch[top-1 ] , p[i]- ch[top -2 ]) <= 0 )top -- ;
        ch[top++ ] = p[i];
    }
    if( n > 1 ) top -- ;
    return  top ;
}

void run()
{
    double a , b ;
    for( int i = 0 ; i < n ; ++ i ){
        cin >> p[i].x >> p[i].y ;
    }
    int m = ConvexHull();
    double ans = 0 ;
    for( int i = 0 ; i < m ; ++i ){
        for( int j = i + 1 ; j < m ; ++j ){
            for( int k = j + 1 ; k < m ; ++k ){
                ans = max ( ans , fabs ( Cross( ch[i] - ch[j] , ch[i] - ch[k] ) ) );
            }
        }
    }
    printf("%.2lf\n", 0.5 * ans  );
}
int main()
{
    ios::sync_with_stdio(false);
    while( cin >> n && n ) run();
}
时间: 2025-01-04 14:50:35

HDU 2202 最大三角形的相关文章

hdu 2202 最大三角形 (凸包)

最大三角形 Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 3078    Accepted Submission(s): 1026 Problem Description 老师在计算几何这门课上给Eddy布置了一道题目,题目是这样的:给定二维的平面上n个不同的点,要求在这些点里寻找三个点,使他们构成的三角形拥有的面积最大.Eddy对这道

HDU 2091 空心三角形 --- 水题

/* HDU 2091 空心三角形 --- 水题 */ #include <cstdio> int main() { int kase = 0; char ch; int h, t; //h表示高 while (scanf("%c", &ch) == 1 && ch != '@'){ scanf("%d", &h); if (kase++){ printf("\n"); } getchar(); if

HDU 2510 符号三角形 NYOJ491 幸运三角形

符号三角形 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 860    Accepted Submission(s): 437 Problem Description 符号三角形的 第1行有n个由"+"和"-"组成的符号 ,以后每行符号比上行少1个,2个同号下面是"+",2个异 号下面

HDOJ 2202 最大三角形 凸包旋转卡壳求最大三角形面积

凸包旋转卡壳求最大三角形面积 最大三角形 Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 3316    Accepted Submission(s): 1119 Problem Description 老师在计算几何这门课上给Eddy布置了一道题目,题目是这样的:给定二维的平面上n个不同的点,要求在这些点里寻找三个点,使他们构成的三角

hdu 1374 求三角形外接圆的半径

两种求三角形外接圆半径的方法: 方法一: 已知三角形的三边为a,b,c,a小于等于b小于等于c, 它的外接圆半径为 R=abc/( 4S) S为三角形面积,可由海伦公式得到:S=√[p(p-a)(p-b)(p-c)]其中P是周长的一半 证明:对于任意三角形,其面积S=(1/2)*absinC 由正弦定理:a/sinA=b/sinB=c/sinC=2R 因,c/sinC=2R 故,R=c/2sinC 又由面积公式得:sinC=2S/ab 故,R=(c/2)/(2S/ab) 即,R=abc/4S 方

hdu 5312 Sequence 三角形数

这道题可以用三角形数的性质解出来,所谓三角形数就是n*(n-1)/2其中n>2.就是1,3,6,10--,也可以表示为 n*(n+1)/2...性质:任何一个正整数最多用三个三角形数就可以表示出来,这道题是3*n*(n-1)+1,就可以 表示为6*(n*(n-1)/2)+1,假如m需要k(k>=3)个数来表示,就相当于6*(k个三角形数的和)+k = m:所以 只要判断(m-k)%6是否等于0就可以了.需要一个或两个数的时候需要特判一下.通过这道题了解了三角形数的这个神性质 贴代码: #inc

hdu 2091 空心三角形

这题还是比较坑的首先要注意两点: 1.行末没有多余的空格; 2.就是当n==1的时候单独判断; #include <iostream> using namespace std; int main() { char ch; int n,flag=0; while(cin>>ch) { if(ch=='@') break; cin>>n; if(flag) cout<<endl; flag=1; if(n==1) { cout<<ch<<

HDU 2510 - 符号三角形

DFS后打表 1 #include <iostream> 2 using namespace std; 3 int s[] ={0,0,0,4,6,0,0,12,40,0,0,171,410,0,0,1896,5160,0,0,32757,59984,0,0,431095,822229}; 4 int main() 5 { 6 int n; 7 while(~scanf("%d",&n)&n) 8 { 9 printf("%d %d\n"

致初学者(三): HDU 2033~ 2043题解

下面继续给出HDU 2033~2043的AC程序,供大家参考.2033~2043这10道题就被归结为“ACM程序设计期末考试(2006/06/07) ”和“2005实验班短学期考试 ”. HDU 2033:人见人爱A+B 简单分支结构. #include <stdio.h> int main() { int n,ah,am,as,bh,bm,bs; scanf("%d",&n); while (n--) { scanf("%d%d%d%d%d%d"