Cod sursa(job #784864)

Utilizator DaNutZ2UuUUBB Bora Dan DaNutZ2UuU Data 7 septembrie 2012 09:31:48
Problema Popandai Scor 8
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.27 kb
#include <fstream>
#include <algorithm>
#include<iomanip>
#define maxn 410

using namespace std;

ifstream fin("popandai.in");
ofstream fout("popandai.out");

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];

int cmp(punct a, punct b)
{
    return a.x<b.x;
}

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()
{

    fin>>n>>q;
    for(i=1; i<=n; i++)
    {
        fin>>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=2000000010;
    for(i=1; i<=n; i++)
    {
        for(j=i+1; j<=n; j++)
        {
            for(k=0; k<=n; k++)
            {
                sus[k]=jos[k]=1000000010;
            }
            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[j][k]-p[i][j]-p[i][k]-1;
                    }
                    else
                    if(v[k].x>v[j].x)
                    {
                        nrp=p[i][k]-p[i][j]-p[j][k]-1;
                    }
                    else
                    {
                        nrp=p[i][k]-p[i][j]+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] && sus[q-k]!=1000000010 && jos[k]!=1000000010)
                {
                    sol=sus[q-k]+jos[k];
                }
            }
        }
    }
    //fout<<float(sol/2);
	float solutie=sol;
	
	
	  fout<<setprecision(1)<<solutie/2;
    return 0;  
}