Pagini recente » Cod sursa (job #2305670) | Cod sursa (job #312454) | Cod sursa (job #529741) | Cod sursa (job #877329) | Cod sursa (job #1721236)
#include <cstdio>
#include <algorithm>
using namespace std;
const int MAX = 301;
const double INF = 2000000000.000;
struct puncte
{
int x, y;
} v[MAX];
int d[MAX][MAX];
double ans[MAX], Ans[MAX];
bool cmp(puncte a, puncte b)
{
if(a.x != b.x)
return a.x < b.x;
else
return a.y < b.y;
}
int det(int i, int j, int k)
{
return v[i].x * v[j].y + v[j].x * v[k].y + v[i].y * v[k].x - v[j].x * v[i].y - v[k].x * v[j].y - v[i].x * v[k].y;
}
int main()
{
FILE *fin, *fout;
fin = fopen("popandai.in", "r");
fout = fopen("popandai.out", "w");
int n, k;
fscanf(fin, "%d%d", &n, &k);
for(int i = 1; i <= n; i++)
fscanf(fin, "%d%d", &v[i].x, &v[i].y);
sort(v + 1, v + n + 1, cmp);
for(int i = 1; i <= n; i++)
for(int j = i + 1; j <= n; j++)
for(int k = j + 1; k <= n; k++)
if(det(i, j, k) < 0)
{
d[i][k]++;
d[k][i]++;
}
double sol = INF, Aria = INF;
for (int i = 1; i < n; ++ i)
for (int j = i + 1; j <= n; ++ j)
{
for (int p = 0; p <= n + 1; ++ p)
ans[p] = Ans[p] = INF;
double D;
Aria = INF;
for (int p = 1; p <= n; ++ p)
if (i != p && j != p)
{
D = det(i, j, p);
int x = i, y = j, z = p;
if (v[x].x > v[y].x)
swap(x, y);
if (v[x].x > v[z].x)
swap(x, z);
if (v[y].x > v[z].x)
swap(y, z);
int np;
np = d[x][y] + d[y][z] - d[x][z];
if (np < 0)
np = -np - 1;
if (D > 0)
{
if (ans[np] > D)
ans[np] = D;
}
else
{
D = -D;
if (Ans[np] > D)
Ans[np] = D;
}
}
for (int p = n; p >= 0; -- p)
{
ans[p] = min(ans[p], ans[p + 1]);
Ans[p] = min(Ans[p], Ans[p + 1]);
}
for (int p = 0; p <= k; ++ p)
if (ans[p] + Ans[k - p] < Aria)
Aria = ans[p] + Ans[k - p];
if (Aria < sol)
sol = Aria;
}
fprintf(fout, "%.2f", sol * 0.5);
return 0;
}