#include <fstream>
#include <iomanip>
using namespace std;
ifstream f("popandai.in");
ofstream g("popandai.out");
long long N, K;
pair <long long, long long> Array[305];
long long U[305][305];
long long Max[2][305];
long long Min[30005];
long long res = 1000000000;
void Read()
{
f >> N >> K;
for(long long i = 0; i <= 30000; i++)
Min[i] = -1;
for(long long i = 1; i <= N; i++)
{
f >> Array[i].first >> Array[i].second;
if(Min[Array[i].first] == -1)
{
Min[Array[i].first] = Array[i].second;
}
else
Min[Array[i].first] = min(Array[i].second, Min[Array[i].first]);
}
}
inline long long Area(pair <long long, long long> a, pair <long long, long long> b, pair <long long, long long> c)
{
return a.first * b.second + b.first * c.second + c.first * a.second - a.second * b.first - b.second * c.first - c.second * a.first;
}
inline bool under(pair <long long, long long> x, pair <long long, long long> y, pair <long long, long long> z)
{
pair <long long, long long> a = x, b = y;
if(a.first > b.first)
swap(a, b);
if(a.first > z.first || b.first < z.first)
return 0;
if(Area(a, b, z) < 0)
return 1;
return 0;
}
void precalcUnder()
{
for(long long i = 1; i <= N; i++)
for(long long j = i + 1; j <= N; j++)
{
long long ans = 0;
for(long long k = 1; k <= N; k++)
{
if(k == i || k == j)
continue;
pair <long long, long long> a = Array[i], b = Array[j];
if(a.first > b.first)
swap(a, b);
if(under(Array[i], Array[j], Array[k]) == 1)
++U[i][j];
}
U[j][i] = U[i][j];
}
}
void Solve()
{
for(long long i = 1; i <= N; i++)
for(long long j = i + 1; j <= N; j++)
{
for(long long k = 0; k <= K; k++)
Max[0][k] = Max[1][k] = 1000000000;
long long ans = 0;
if(i == 5 && j == 8)
{
long long p;
p = 0;
}
for(long long k = 1; k <= N; k++)
{
if(k == i || k == j)
continue;
long long poz;
//if(Area(Array[i], Array[j], ))
pair <long long, long long> a = Array[i], b = Array[j], c = Array[k];
long long ind1 = i, ind2 = j, ind3 = k;
if(a > b)
swap(a, b), swap(ind1, ind2);
if(Area(a, b, Array[k]) > 0)
poz = 0;
else
poz = 1;
if(a > c)
swap(a, c), swap(ind1, ind3);
if(b > c)
swap(b, c), swap(ind2, ind3);
long long number;
if(Area(a, c, b) < 0)
{
long long add = 0;
if(Min[b.first] != b.second)
++add;
number = U[ind1][ind3] - U[ind2][ind1] - U[ind2][ind3] - 1 + add;
Max[poz][number] = min(Max[poz][number], -Area(a, c, b));
}
else
{
long long add = 0;
if(Min[b.first] != b.second)
++add;
number = U[ind2][ind1] + U[ind2][ind3] - U[ind1][ind3] - add;
Max[poz][number] = min(Max[poz][number], Area(a, c, b));
}
}
for(long long k = 0; k <= K; k++)
{
if(Max[0][k] == 0 || Max[1][K - k] == 0)
continue;
res = min(res, Max[0][k] + Max[1][K - k]);
}
}
g << fixed << setprecision(1) << (double) res / 2.0 << "\n";
}
int main()
{
Read();
precalcUnder();
Solve();
return 0;
}