Cod sursa(job #341466)

Utilizator GavrilaVladGavrila Vlad GavrilaVlad Data 18 august 2009 15:44:08
Problema Popandai Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.23 kb
#include <stdio.h>
#include <algorithm>

using namespace std;

#define maxn 310

struct punct
{
    long x;
    long y;
};
long n, i, j, k, q, m, sol;
long p[maxn][maxn], nrp;
long sus[maxn], jos[maxn];
punct v[maxn];

inline int cmp(punct a, punct b)
{
    if(a.x!=b.x) return a.x<b.x;
    return a.y>b.y;
}

long det(long a, long b, long c)
{
    return v[a].x * v[b].y + v[b].x * v[c].y + v[c].x * v[a].y
          -v[a].x * v[c].y - v[b].x * v[a].y - v[c].x * v[b].y;
}

long aria(long a, long b, long c)
{
    long ar=det(a, b, c);
    if(ar<0) return -ar;
    return ar;
}
int main()
{
    freopen("popandai.in", "r", stdin);
    freopen("popandai.out", "w", stdout);
    scanf("%d%d", &n, &q);
    for(i=1; i<=n; i++)
    {
        scanf("%d%d", &v[i].x, &v[i].y);
    }
    sort(v+1, v+n+1, cmp);
    for(i=1; i<=n; i++)
    {
        for(j=i+2; j<=n; j++)
        {
            for(k=i+1; k<j; k++)
            {
                if(det(i, j, k)<0)
                {
                    p[i][j]++;
                    p[j][i]++;
                }
            }
        }
    }
    sol=20000010;
    for(i=1; i<=n; i++)
    {
        for(j=i+1; j<=n; j++)
        {
            for(k=0; k<=n; k++)
            {
                sus[k]=jos[k]=20000010;
            }
            for(k=1; k<=n; k++)
            {
                if(k==i || k==j) continue;
                if(det(i, j, k)>0)
                {
                    if(v[k].x<v[i].x)
                    {
                        nrp=p[i][j]+p[i][k]-p[j][k];
                    }
                    else
                    if(v[k].x>v[j].x)
                    {
                        nrp=p[i][j]+p[j][k]-p[i][k];
                    }
                    else
                    {
                        nrp=p[i][j]-p[i][k]-p[j][k]-1;
                    }
                    if(aria(i, j, k)<jos[nrp]) 
                    {
                        jos[nrp]=aria(i, j, k);
                    }
                }
                else
                {
                    if(v[k].x<v[i].x)
                    {
                        nrp=-p[i][j]-p[i][k]+p[j][k]-1;
                    }
                    else
                    if(v[k].x>v[j].x)
                    {
                        nrp=-p[i][j]-p[j][k]+p[i][k]-1;
                    }
                    else
                    {
                        nrp=-p[i][j]+p[i][k]+p[j][k];
                    }
                    if(aria(i, j, k)<sus[nrp]) 
                    {
                        sus[nrp]=aria(i, j, k);
                    }
                }
            }
            m=sus[n];
            for(k=n; k>=0; k--)
            {
                if(m>sus[k]) m=sus[k];
                sus[k]=m;
            }
            m=jos[n];
            for(k=n; k>=0; k--)
            {
                if(m>jos[k]) m=jos[k];
                jos[k]=m;
            }
            for(k=0; k<=q; k++)
            {
                if(sol>sus[q-k]+jos[k])
                {
                    sol=sus[q-k]+jos[k];
                }
            }
        }
    }
    printf("%.1lf\n", (double)sol/2);
    return 0;  
}