Cod sursa(job #1714630)

Utilizator akaprosAna Kapros akapros Data 8 iunie 2016 22:06:08
Problema Popandai Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.72 kb
#include <bits/stdc++.h>
#define maxN 302
#define zeros(x) x & (-x)
#define inf 2000000000.00
#define x first
#define y second
#define pii pair < int, int >
using namespace std;
using namespace std;
int n, k, m, d[maxN][maxN];
double ans[maxN], Ans[maxN], sol, Aria;
int Norm[maxN], aib[maxN];
pii v[maxN];

int Det(int i, int j, int k)
{
    int det = 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;
    return det;
}

void read()
{
    int i;
    freopen("popandai.in", "r", stdin);
    scanf("%d %d", &n, &k);
    for (i = 1; i <= n; ++ i)
        scanf("%d %d", &v[i].x, &v[i].y);
}
void prec()
{
    int i, j, k;
    for (i = 1; i <= n; ++ i)
        for (j = i + 1; j <= n; ++ j)
            for (k = j + 1; k <= n; ++ k)
                if (Det(i, j, k) < 0)
                {
                    ++ d[i][k];
                    ++ d[k][i];
                }
}
void solve()
{
    int i, j, p;
    sort(v + 1, v + n + 1);
    prec();
    sol = inf;
    for (i = 1; i < n; ++ i)
        for (j = i + 1; j <= n; ++ j)
        {
            for (p = 0; p <= n + 1; ++ p)
                ans[p] = Ans[p] = inf;
            double D;
            Aria = inf;
            for (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 (p = n; p >= 0; -- p)
            {
                ans[p] = min(ans[p], ans[p + 1]);
                Ans[p] = min(Ans[p], Ans[p + 1]);
            }
            for (p = 0; p <= k; ++ p)
                if (ans[p] + Ans[k - p] < Aria)
                    Aria = ans[p] + Ans[k - p];

            if (Aria < sol)
                sol = Aria;
        }
}
void write()
{
    freopen("popandai.out", "w", stdout);
    sol = sol * 0.5;
    printf("%.5lf", sol);
}
int main()
{
    read();
    solve();
    write();
    return 0;
}