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

2980 단어 codeforces
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: xi, yi ( - 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.
문제는 네 개의 점을 찾아 가장 큰 사각형의 면적을 구하고 대각선을 매거하면 우리는 상삼각형의 최대치와 하삼각형의 최대치를 구할 수 있다. 그러면 우리는 가장 큰 사각형의 면적을 얻을 수 있고 포크로 면적을 얻을 수 있으며 양과 음을 통과해서 상삼각형이냐 하삼각형이냐를 구할 수 있다. 그러면 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; }

 

좋은 웹페이지 즐겨찾기