HDU 2202 最大三角形

题解:先算出凸包,然后枚举凸包上的点计算即可

#include <cstdio>

#include <cmath>

#include <cstdlib>

#include <iostream>

using namespace std;

const int N = 50005;

const double eps = 1e-8;

struct point {int x,y;}p[N], stack[N];

bool isZero(double x){return (x>0?x:-x)<eps;}

double dis(point A, point B){return sqrt((A.x-B.x)*(A.x-B.x)+(A.y-B.y)*(A.y-B.y));}

int crossProd(point A, point B, point C){return (B.x-A.x)*(C.y-A.y)-(B.y-A.y)*(C.x-A.x);}

int cmp(const void *a, const void *b){

    point*c=(point*)a;

    point*d=(point*)b;

    double k = crossProd(p[0], *c, *d);

    if (kdis(p[0], *d))) return 1;

    return -1;

}

int Graham(int n) {

    int x = p[0].x;

    int y = p[0].y;

    int mi = 0;

    for (int i=1; i<n; ++i) {

        if (p[i].x=2)--top;

        stack[++top]=p[i];

    }

    return top;    

}

double maxTrangle(int n) {

    int top=Graham(n);

    double area,maxArea = 0;

    for (int i=0;i<top;++i) {

        for (int j=i+1;j<top;++j) {

            for (int k=j+1;k<=top;++k) {

                area=crossProd(stack[i],stack[j],stack[k]);

                if (maxArea<area) maxArea=area; 

            }

        }

    }

    return maxArea*0.5;

}

int main() {

    int n;

    while (scanf("%d", &n) != EOF) {

        for (int i=0; i<n; ++i) scanf ("%d%d", &p[i].x, &p[i].y);

        double ans = maxTrangle(n);

        printf ("%.2lf\n", ans);

    }

    return 0;

}

你可能感兴趣的:(HDU)