Pagini recente » Cod sursa (job #127948) | Monitorul de evaluare | Monitorul de evaluare | Istoria paginii utilizator/ursudan | Cod sursa (job #1019964)
#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;
}