Cod sursa(job #1019964)

Utilizator florin.elfusFlorin Elfus florin.elfus Data 1 noiembrie 2013 13:14:20
Problema Popandai Scor 8
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.09 kb
#include <stdio.h>
#include <algorithm>

using namespace std;

struct punct {
    int x, y;
} x[333];

inline bool comp(punct A, punct B) {
    return A.x < B.x;
}

inline int ccw(punct A, punct B, punct C) {
    return (B.x - A.x) * (C.y - B.y) - (B.y - A.y) * (C.x - B.x);
}

int under[333][333];

int tri(int i, int j, int k) {
    if (ccw(x[i], x[k], x[j]) > 0)
        return under[i][j] + under[j][k] - under[i][k];
    return under[i][k] - under[i][j] - under[j][k] - 1;
}

double best[333];

int main() {
    freopen("popandai.in", "r", stdin);
    freopen("popandai.out", "w", stdout);

    int N, K;
    scanf("%d%d", &N, &K);
    for (int i = 1; i <= N; ++i)
        scanf("%d%d", &x[i].x, &x[i].y);
    sort(x + 1, x + N + 1, comp);

    for (int i = 1; i <= N; ++i)
        for (int j = i + 1; j <= N; ++j)
            for (int k = 1; k <= N; ++k)
                if (k != i && k != j)
                    if (x[i].x <= x[k].x && x[k].x <= x[j].x)
                        if (ccw(x[i], x[j], x[k]) < 0)
                            ++under[i][j];

    int sol = 1000005555;
    for (int i = 1; i <= N; ++i)
        for (int j = i + 1; j <= N; ++j) {
            for (int k = 0; k <= N; ++k)
                best[k] = 500000000;
            for (int k = 1; k <= N; ++k)
                if (k != i && k != j)
                    if (ccw(x[i], x[j], x[k]) > 0) {
                        int in = tri(i, j, k);
                        if (best[in] > ccw(x[i], x[j], x[k]))
                            best[in] = ccw(x[i], x[j], x[k]);
                    }
            for (int k = 1; k <= N; ++k)
                if (k != i && k != j)
                    if (ccw(x[i], x[j], x[k]) < 0) {
                        int in = tri(i, j, k);
                        if (K - in >= 0) {
                            int cur = best[K - in] - ccw(x[i], x[j], x[k]);
                            if (cur < sol)
                                sol = cur;
                        }
                    }
        }

    printf("%.1lf", (double)sol * 0.5);
    return 0;
}