Cod sursa(job #47434)

Utilizator fireatmyselfBogdan-Alexandru Stoica fireatmyself Data 3 aprilie 2007 18:10:41
Problema Popandai Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.57 kb
#include <cstdio>
#include <cmath>
#include <vector>
#include <algorithm>
#define NMAX 330
#define x first
#define y second
#define INF 666666
#define eps 0.0000001
#define MAX(a,b) (((a)-(b)>eps) ? (a):(b))

using namespace std;

int Under[NMAX][NMAX], N, K;
vector<pair<int,int> > P;
double Amax=INF, Up[NMAX], Down[NMAX];

double arie(int i, int j, int k)
{
        return (0.5*(double)abs((P[i].x*P[j].y-P[j].x*P[i].y)+(P[j].x*P[k].y-P[k].x*P[j].y)+(P[k].x*P[i].y-P[i].x*P[k].y)));
}

int main()
{
        int i, j, k, x, y, a, b, c, cate = 0;
        double xjos, yjos, sup;

        freopen("popandai.in", "r", stdin);
        scanf("%d %d", &N, &K);

        for (i = 1; i <= N; i++){
            scanf("%d %d", &x, &y);
            P.push_back(make_pair(x,y)); }

        sort(P.begin(), P.end());

         for (i = 0; i < N; i++)
            for (j = i+1; j < N; j++)
            {
                for (k = 0; k < N; k++)
                    if ( (i!=k && j!=k) && (P[i].x <= P[k].x && P[k].x <= P[j].x) )
                    {
                        a = P[j].y-P[i].y; b = P[i].x-P[j].x; c = P[i].x*P[j].y-P[j].x*P[i].y;
                        Under[i][j] += ((P[k].x*a+P[k].y*b+c)<0);
                    }
                Under[i][j] = Under[j][i];
            }

        for (i = 0; i < N; i++)
            for (j = i+1; j < N; j++)
            {
                memset(Up,0,sizeof(Up));
                memset(Down,0,sizeof(Down));
                for (k = j+1; k < N; k++)
                {
                        a = P[k].y-P[i].y; b = P[i].x-P[k].x; c = P[i].x*P[k].y-P[k].x*P[i].y;
                        if ( ((P[j].x*a+P[j].y*b+c)>=0) )
                        {
                           Down[ x=Under[i][k]-Under[i][j]-Under[j][k]-1 ] = MAX(arie(i,j,k),Down[ Under[i][k]-Under[i][j]-Under[j][k]-1 ]);
                           if (x < 0)
                           return 1;
                        }
                        else
                        {
                           Up[ x=Under[i][j]+Under[j][k]-Under[i][k] ] = MAX(arie(i,j,k),Up[ Under[i][j]+Under[j][k]-Under[i][k] ]);
                           if (x < 0)
                              return 1;
                        }
                }
                
                for (k = 0; k <= K; k++)
                    if ((Down[k]>eps && Up[K-k]>eps)&&(Amax > (Down[k]+Up[K-k])))
                       Amax = Down[k]+Up[K-k];
            }

        freopen("popandai.out", "w", stdout);
        printf("%02lf\n", Amax);

        return 0;
        
}