• Codeforces Round #198 (Div. 2) B. Maximal Area Quadrilateral


    B. Maximal Area Quadrilateral
    time limit per test
    1 second
    memory limit per test
    256 megabytes
    input
    standard input
    output
    standard output

    Iahub has drawn a set of n points in the cartesian plane which he calls "special points". A quadrilateral is a simple polygon without self-intersections with four sides (also called edges) and four vertices (also called corners). Please note that a quadrilateral doesn't have to be convex. A special quadrilateral is one which has all four vertices in the set of special points. Given the set of special points, please calculate the maximal area of a special quadrilateral.

    Input

    The first line contains integer n (4 ≤ n ≤ 300). Each of the next n lines contains two integers: xiyi ( - 1000 ≤ xi, yi ≤ 1000) — the cartesian coordinates of ith special point. It is guaranteed that no three points are on the same line. It is guaranteed that no two points coincide.

    Output

    Output a single real number — the maximal area of a special quadrilateral. The answer will be considered correct if its absolute or relative error does't exceed 10 - 9.

    Sample test(s)
    input
    5
    0 0
    0 4
    4 0
    4 4
    2 3
    
    output
    16.000000
    Note

    In the test example we can choose first 4 points to be the vertices of the quadrilateral. They form a square by side 4, so the area is 4·4 = 16.

    题 意就是找4个点,求最大的四边形的面积,枚举对角线,我们可以求出上三角形的最大值,和下三角形的最大值,这样,我们就可以得出最大的四边形的面积,用叉积可以得出面积,还可以通过其正负,得出是上三角形,还是下三角形,这样,就可以得到了n^3的算法了!

     

    #include <iostream>
    #include <stdio.h>
    #include <string.h>
    using namespace std;
    #define M 350
    #define eps 0
    #define inf 10000000000
    struct node {
        double x,y;
    }p[M];
    double mul(int i,int j,int k){
        return ((p[k].x-p[i].x)*(p[k].y-p[j].y)-(p[k].y-p[i].y)*(p[k].x-p[j].x))/2.0;
    }
    int main()
    {
        int n,i,j,k;
        while(scanf("%d",&n)!=EOF){
            for(i=0;i<n;i++){
                scanf("%lf%lf",&p[i].x,&p[i].y);
            }
            double lmax=-inf,rmax=-inf,amax=-inf;
            for(i=0;i<n;i++){
                for(j=0;j<n;j++){
                    if(i==j)
                    continue;
                    lmax=-inf,rmax=-inf;
                    for(k=0;k<n;k++){
                        if(i==k||j==k)
                        continue;
                        double temp=mul(i,j,k);
                        if(temp<eps){
                            lmax=max(lmax,-temp);
                        }
                        else {
                            rmax=max(rmax,temp);
                        }
                    }
                    amax=max(amax,lmax+rmax);
                   // printf("%.6f %.6ffdsf
    ",amax,lmax+rmax);
                }
            }
            printf("%.6f
    ",amax);
        }
        return 0;
    }
    


  • 相关阅读:
    一个提高N倍系统新能的编程点,却总是被普通开发们遗忘
    工作不到一年,做出了100k系统,老板给我升职加薪
    offer收割机也有方法论
    最长公共前缀
    罗马数字转整数
    回文数
    整数反转
    两数之和
    网页中Office和pdf相关文件导出
    搭建一个低配版的Mock Server
  • 原文地址:https://www.cnblogs.com/pangblog/p/3320367.html
Copyright © 2020-2023  润新知