Cod sursa(job #1782308)

Utilizator StarGold2Emanuel Nrx StarGold2 Data 17 octombrie 2016 23:00:15
Problema Popandai Scor 76
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.96 kb
#include <fstream>
#include <iostream>
#include <cmath>
#include <algorithm>
#include <climits>
#include <iomanip>
using namespace std;

ifstream in ( "popandai.in"  );
ofstream out( "popandai.out" );

const int DIM = 3e2 + 5;

pair<int, int> p[DIM];
int cnt[DIM][DIM], dp1[DIM], dp2[DIM];

int ccw( pair<int, int> p1, pair<int, int> p2, pair<int, int> p3 ) {
    return (p2.first - p1.first) * (p3.second - p1.second) - (p3.first - p1.first) * (p2.second - p1.second);
}

int query( int i, int j, int k ) {
    if( i > j ) swap( i, j );
    if( i > k ) swap( i, k );
    if( j > k ) swap( j, k );

    int x = cnt[i][j], y = cnt[i][k], z = cnt[j][k];

    if( ccw( p[i], p[k], p[j] ) > 0 )
        return cnt[i][j] + cnt[j][k] - cnt[i][k] - 1;
    else
        return cnt[i][k] - cnt[i][j] - cnt[j][k];
}

int main( int argc, const char *argv[] ) {

    int n, m; in >> n >> m;

    for( int i = 1; i <= n; i ++ )
        in >> p[i].first >> p[i].second;

    sort( p + 1, p + n + 1 ); int ans = INT_MAX;

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

    for( int i = 1; i <= n; i ++ ) {
    for( int j = i + 1; j <= n; j ++ ) {
        fill( dp1, dp1 + n + 2, INT_MAX );
        fill( dp2, dp2 + n + 2, INT_MAX );

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

            if( ccw( p[i], p[j], p[k] ) > 0 )
                dp1[ query( i, j, k ) ] = min( dp1[ query( i, j, k ) ], +ccw( p[i], p[j], p[k] ) );
            else
                dp2[ query( i, j, k ) ] = min( dp2[ query( i, j, k ) ], -ccw( p[i], p[j], p[k] ) );
        }

        for( int k = 0; k <= m; k ++ ) {
            if( dp1[k] == INT_MAX || dp2[m - k] == INT_MAX )
                continue;

            ans = min( ans, dp1[k] + dp2[m - k] );
        }
    }}

    out << setprecision(1) << fixed << ans / 2.0 << endl;
    return 0;
}