Pagini recente » Cod sursa (job #226270) | Cod sursa (job #1416792) | Cod sursa (job #519654) | Cod sursa (job #1504623) | Cod sursa (job #590097)
Cod sursa(job #590097)
# include <algorithm>
# include <cstdio>
# include <cstring>
using namespace std ;
# define a first
# define b second
typedef pair < int, int > PR ;
const char *FIN = "popandai.in", *FOU = "popandai.out" ;
const int MAX = 305, oo = 0x7FFFFFFF ;
PR V[MAX] ;
int sub[MAX][MAX], dp[2][MAX] ;
int N, P ;
inline int area (PR p1, PR p2, PR p3) {
return p1.a * p2.b + p2.a * p3.b + p3.a * p1.b - p1.a * p3.b - p3.a * p2.b - p2.a * p1.b ;
}
inline int if_ins (int i, int j, int k) {
if ( V[k] < V[i] ) {
int X = i;
i = k, k = j, j = X ;
} else if ( V[k] < V[j] ) {
int X = j ;
j = k, k = X ;
}
return abs (sub[i][j] + sub[j][k] - sub[i][k]) - ((V[k].a != V[j].a && (area (V[i], V[k], V[j]) < 0)) + (V[i].a == V[j].a) * 2) ;
}
int main (void) {
freopen (FIN, "r", stdin) ;
scanf ("%d %d", &N, &P) ;
for (int i = 0; i < N; ++i) {
scanf ("%d %d", &V[i].a, &V[i].b) ;
}
sort (V, V + N) ;
for (int i = 0; i < N; ++i) {
for (int j = i + 1; j < N; ++j) {
for (int k = 0; k < N; ++k) {
if (i != k && j != k && V[i].a <= V[k].a && V[j].a > V[k].a && (area (V[i], V[j], V[k]) < 0)) {
++sub[i][j], ++sub[j][i] ;
}
}
}
}
int sol = oo ;
for (int i = 0; i < N; ++i) {
for (int j = i + 1; j < N; ++j) {
for (int k = 0; k < N; ++k) {
dp[0][k] = dp[1][k] = oo ;
}
for (int k = 0; k < N; ++k) {
if (i != k && j != k) {
int ind = area (V[i], V[j], V[k]) < 0, R = if_ins (i, j, k) ;
dp[ind][R] = min (dp[ind][R], abs (area (V[i], V[j], V[k]))) ;
}
}
for (int k = N - 2; k + 1; --k) {
for (int l = 0; l < 2; ++l) {
dp[l][k] = min (dp[l][k], dp[l][k + 1]) ;
}
}
for (int k = 0; k <= P; ++k) {
if (dp[0][k] != oo && dp[1][P - k] != oo) {
sol = min (sol, dp[0][k] + dp[1][P - k]) ;
}
}
}
}
fprintf ( fopen (FOU, "w"), "%.1lf", sol / 2.0 ) ;
}