Cod sursa(job #562513)

Utilizator DraStiKDragos Oprica DraStiK Data 23 martie 2011 10:51:51
Problema Popandai Scor 88
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.22 kb
#include <algorithm>
using namespace std;

#define sc second
#define fs first

#define INF 0x3f3f3f3f
#define DIM 305

pair <int,int> v[DIM];
int up[DIM],dn[DIM];
int sub[DIM][DIM];
int N,K,sol;
int ind[5];

void read ()
{
    int i;

    scanf ("%d%d",&N,&K);
    for (i=1; i<=N; ++i)
        scanf ("%d%d",&v[i].fs,&v[i].sc);
}

inline int det (int a,int b,int c)
{
    return (v[b].fs-v[a].fs)*(v[c].sc-v[a].sc)-(v[c].fs-v[a].fs)*(v[b].sc-v[a].sc);
}

void init ()
{
    int i,j,k;

    sort (v+1,v+N+1);

    for (i=1; i<=N; ++i)
        for (j=i+1; j<=N; ++j)
        {
            for (k=i+1; k<j; ++k)
                if (det (i,j,k)<0)
                    ++sub[i][j];
            sub[j][i]=sub[i][j];
        }


}

struct cmp
{
    bool operator () (const int &a,const int &b)
    {
        return v[a].fs<v[b].fs;
    }
};

void solve ()
{
    int i,j,k,nrp;

    sol=INF;
    for (i=1; i<=N; ++i)
        for (j=i+1; j<=N; ++j)
        {
            memset (up,INF,sizeof (up));
            memset (dn,INF,sizeof (dn));

            for (k=1; k<=N; ++k)
                if (k!=i && k!=j)
                {
                    ind[1]=i; ind[2]=j; ind[3]=k;
                    sort (ind+1,ind+4,cmp ());

                    if (det (ind[1],ind[2],ind[3])<0)
                        nrp=sub[ind[1]][ind[2]]+sub[ind[2]][ind[3]]-sub[ind[1]][ind[3]];
                    else
                        nrp=sub[ind[1]][ind[3]]-sub[ind[1]][ind[2]]-sub[ind[2]][ind[3]]-1;

                    if (det (i,j,k)<0)
                        dn[nrp]=min (dn[nrp],abs (det (i,j,k)));
                    else
                        up[nrp]=min (up[nrp],abs (det (i,j,k)));
                }

            for (k=N-1; k>=0; --k)
            {
                up[k]=min (up[k],up[k+1]);
                dn[k]=min (dn[k],dn[k+1]);
            }

            for (k=0; k<=K; ++k)
                if (up[k]!=INF && dn[K-k]!=INF)
                    sol=min (sol,up[k]+dn[K-k]);
        }
    printf ("%.1lf",(double)sol/2);
}

int main ()
{
    freopen ("popandai.in","r",stdin);
    freopen ("popandai.out","w",stdout);

    read ();
    init ();
    solve ();

    return 0;
}