Cod sursa(job #1721236)

Utilizator Vlad_317Vlad Panait Vlad_317 Data 24 iunie 2016 22:24:22
Problema Popandai Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.65 kb
#include <cstdio>
#include <algorithm>
using namespace std;

const int MAX = 301;
const double INF = 2000000000.000;
struct puncte
{
    int x, y;
} v[MAX];
int d[MAX][MAX];
double ans[MAX], Ans[MAX];


bool cmp(puncte a, puncte b)
{
    if(a.x != b.x)
        return a.x < b.x;
    else
        return a.y < b.y;
}

int det(int i, int j, int k)
{
    return v[i].x * v[j].y + v[j].x * v[k].y + v[i].y * v[k].x - v[j].x * v[i].y - v[k].x * v[j].y - v[i].x * v[k].y;

}

int main()
{
    FILE *fin, *fout;

    fin = fopen("popandai.in", "r");
    fout = fopen("popandai.out", "w");

    int n, k;

    fscanf(fin, "%d%d", &n, &k);

    for(int i = 1; i <= n; i++)
        fscanf(fin, "%d%d", &v[i].x, &v[i].y);

    sort(v + 1, v + n + 1, cmp);

    for(int i = 1; i <= n; i++)
        for(int j = i + 1; j <= n; j++)
            for(int k = j + 1; k <= n; k++)
                if(det(i, j, k) < 0)
                {
                    d[i][k]++;
                    d[k][i]++;
                }

    double sol = INF, Aria = INF;
    for (int i = 1; i < n; ++ i)
        for (int j = i + 1; j <= n; ++ j)
        {
            for (int p = 0; p <= n + 1; ++ p)
                ans[p] = Ans[p] = INF;
            double D;
            Aria = INF;
            for (int p = 1; p <= n; ++ p)
                if (i != p && j != p)
                {
                    D = det(i, j, p);
                    int x = i, y = j, z = p;
                    if (v[x].x > v[y].x)
                        swap(x, y);

                    if (v[x].x > v[z].x)
                        swap(x, z);

                    if (v[y].x > v[z].x)
                        swap(y, z);
                    int np;
                    np = d[x][y] + d[y][z] - d[x][z];
                    if (np < 0)
                        np = -np - 1;
                    if (D > 0)
                    {
                        if (ans[np] > D)
                            ans[np] = D;
                    }
                    else
                    {
                        D = -D;
                        if (Ans[np] > D)
                            Ans[np] = D;
                    }

                }
            for (int p = n; p >= 0; -- p)
            {
                ans[p] = min(ans[p], ans[p + 1]);
                Ans[p] = min(Ans[p], Ans[p + 1]);
            }
            for (int p = 0; p <= k; ++ p)
                if (ans[p] + Ans[k - p] < Aria)
                    Aria = ans[p] + Ans[k - p];

            if (Aria < sol)
                sol = Aria;
        }

    fprintf(fout, "%.2f", sol * 0.5);

    return 0;
}