Cod sursa(job #1366489)

Utilizator dr_personalityEftime Andrei Horatiu dr_personality Data 1 martie 2015 09:46:19
Problema Popandai Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.19 kb
#include <fstream>
#include <algorithm>
#include <iomanip>
using namespace std;
ifstream in ("popandai.in");
ofstream out ("popandai.out");

struct punct{
    int x, y;
}v[310];

const int nmax = 306, inf = 1000000000;
int n, k, sol, d[nmax][nmax];
double sus[nmax], jos[nmax], rasp;
 
bool compar (punct a, punct b)
{
	if(a.x!=b.x)
		return a.x<b.x;
	else
		return a.y<b.y;
}
 
int det ( int i, int j, int h) {
    return 1LL*(v[j].x - v[i].x) * (v[h].y-v[i].y) - 1LL*(v[h].x - v[i].x) * (v[j].y - v[i].y);
}
 
int main () {
	int player_unu=0;

	int a, b, c;

	out<<setprecision(1)<<fixed;

    in>>n>>k;
 
    for (int i=1;i<=n;i++)
        in>>v[i].x>>v[i].y;
 
    sort (v + 1,v + n + 1, compar);
 
    for (int i = 1; i<n; i++)
	{
        for(int j = i + 1; j<n; j++)
		{
            for (int h = j + 1; h<=n; h++)
			{
                if (det(i, h, j)<0)
				{
                    d[i][h]++;
                    d[h][i]++;
                }
			}
		}
	}
 
    rasp = inf;
 
    for (int i = 1; i<n; i++)
	{
        for (int j = i + 1; j<=n; j++)
		{
            for (int h = 0; h<=n; h++)
                sus[h] = jos[h] = inf;

            for (int h = 1; h<=n; h++)
			{
                if (i==h || j==h)
                    continue;

                a = min(min(i, j), h);
                c = max(max(i, j), h);
                b = i;

                if (b==a||b==c) {
                    b = j;
                    if (b==a||b==c)
                        b = h;
                }

                sol = d[a][b] + d[b][c] - d[a][c];

                if (sol<0)
                   sol = (sol * (-1)) - 1;

                if (det(i, j, h)>0)
                    sus[sol] = min(sus[sol], 1.0*det(i, j, h) / 2.0);
                else
                    jos[sol] = min(jos[sol], -1.0*det(i, j, h) / 2.0);
            }

            for(int h = n - 1; h>=0; h--)
			{
                sus[h] = min(sus[h], sus[h + 1]);
                jos[h] = min(jos[h], jos[h + 1]);
            }

            for (int h = 0; h<=k; h++)
                rasp = min(rasp, sus[h] + jos[k - h]);
        }
	}

    out<<rasp<<"\n";
 
    return 0;
}