Pagini recente » Cod sursa (job #2071218) | Cod sursa (job #519976) | Cod sursa (job #1122236) | Cod sursa (job #214432) | Cod sursa (job #1782261)
#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 );
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] + 1;
}
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] ++, cnt[j][i] ++;
}}
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 == j || i == 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 i = 0; i <= m; i ++ ) {
if( dp1[i] == INT_MAX || dp2[m - i] == INT_MAX )
continue;
ans = min( ans, dp1[i] + dp2[m - i] );
}
}}
out << setprecision(1) << fixed << ans / 2.0 << endl;
return 0;
}