Cod sursa(job #2011179)

Utilizator mariusn01Marius Nicoli mariusn01 Data 15 august 2017 14:49:38
Problema Popandai Scor 4
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.71 kb
#include <fstream>
#include <iostream>
#include <algorithm>
#define DIM 310
#define INF 2000000000
#define x first
#define y second
using namespace std;

int det(int X1, int Y1, int X2, int Y2, int X3, int Y3) {
    return (X2-X1)*(Y3-Y1) - (X3-X1)*(Y2-Y1);
}

int n, i, j, k, K, sol, aria, puncte, t;
pair<int, int> v[DIM];
int a[DIM][DIM], sub[DIM], sus[DIM], jos[DIM];

int getPoints(pair<int, int> i, pair<int, int> j, pair<int, int> k, int pi, int pj, int pk) {
    int puncte = 0;
    if (i > j)
        swap(i, j), swap(pi, pj);
    if (i > k)
        swap(i, k), swap(pi, pk);
    if (j < k)
        swap(j, k), swap(pj, pk);

    if (det(i.x, i.y, j.x, j.y, k.x, k.y) < 0) {

        /// k este sub
        if (sub[pi] != pk && sub[pj] != pk) {
            puncte = a[pi][pj] - a[pi][pk] - a[pk][pj];
            if (sub[pk])
                puncte++;
        } else
            if (sub[pi] == pk) {
                puncte = a[pi][pj] - a[pk][pj] - 1;
            } else
                puncte = a[pi][pj] - a[pi][pk] - 1;
    } else
        if (det(i.x, i.y, j.x, j.y, k.x, k.y) > 0) {
            if (sub[pk] != pi && sub[pk] != pj) {
                puncte = a[pi][pk] + a[pk][pj] - a[pi][pj];
                if (sub[pk] && det(i.x, i.y, j.x, j.y, v[ sub[pk] ].x, v[ sub[pk] ].y) > 0)
                    puncte--;
            } else
                if (sub[pk] == pi)
                    puncte = a[pk][pj] - a[pi][pj] - 1;
                else
                    puncte = a[pi][pk] - a[pi][pj] - 1;
        }
    return puncte;
}

inline int modul(int x) {
    return (x > 0 ? x : -x);
}

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

    //cout<<det(0, 0, 1, 0, 1, -1);

    fin>>n>>K;
    for (i=1;i<=n;i++)
        fin>>v[i].x>>v[i].y;
    sol = INF;
    sort(v+1, v+n+1);
    for (i=1;i<n;i++)
        for (j=i+1;j<=n;j++) {
            a[i][j] = 0;
            for (k=1;k<=n;k++) {
                if ((v[k].x - v[i].x) * (v[k].x - v[j].x) <= 0 &&
                    (v[k].y - v[i].y) * (v[k].y - v[j].y) <= 0 ) {
                    continue;
                }
                if (det(v[i].x, v[i].y, v[j].x, v[j].y, v[k].x, v[k].y) < 0 &&
                    (v[k].x - v[i].x) * (v[k].x - v[j].x) <= 0) {
                    a[i][j]++;
                    continue;
                }
            }
            a[j][i] = a[i][j];

            if (v[i].x == v[j].x) {
                if (v[i].y < v[j].y)
                    sub[j]= i;
                else
                    if (v[j].y < v[i].y)
                        sub[i] = j;
            }

        }

    for (i=1;i<n;i++)
        for (j=i+1;j<=n;j++) {
            for (k=0;k<=n;k++)
                sus[k] = jos[k] = INF;
            for (k=1;k<=n;k++){

                if (k == i || k == j)
                    continue;

                aria = modul( det(v[i].x, v[i].y, v[j].x, v[j].y, v[k].x, v[k].y) );
                puncte = getPoints(v[i], v[j], v[k], i, j, k);

                if (det(v[i].x, v[i].y, v[j].x, v[j].y, v[k].x, v[k].y) < 0) {
                    jos[puncte] = min(jos[puncte], aria);
                } else {
                    sus[puncte] = min(sus[puncte], aria);
                }
            }

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

            for (t = 0; t<=K; t++) {
                sol = min(sol, sus[t] + jos[K-t]);
                sol = min(sol, jos[t] + sus[K-t]);
            }


        }

    fout<<sol/2;
    if (sol % 2 == 0)
        fout<<".0\n";
    else
        fout<<".5\n";

    return 0;
}