#include <iostream>
#include <iomanip>
using namespace std;

const double err = 0.000000001;
const double M = 1000000.0;

struct myStack{
  int p;
  myStack *next;
};

myStack *S;
int n,b;
double x[100],y[100], totalpts[100];
bool hull[100];
double OneBoard[100][100], Best[100][100];

void PUSH( int p0){
  myStack *newnode = new myStack;

  newnode->p = p0;
  newnode->next = S;
  S = newnode;
}

void POP(){
 S = S->next;
}

void printStack(){
  myStack *P = S;
  while(P!=NULL){
   cout<<P->p<<' ';
   P=P->next;
  }
  cout<<endl;
}

void getPoints(int n){
  for(int i=0;i<n;i++)
   cin>>x[i]>>y[i];
}

bool LHangle(int p0, int p1, int p2){
 double x0,y0,x1,y1,x2,y2;
 x0=x[p0]; y0=y[p0];
 x1=x[p1]; y1=y[p1];
 x2=x[p2]; y2=y[p2];


 if((y1-y0)/(x1-x0) < (y2-y1)/(x2-x1) + err) return true;
 else return false;

}

void markConvexHull(){
  for (int i=0;i<n;i++) hull[i]=false;

  S = NULL; 
  PUSH(0); PUSH(1); PUSH(2);
 if(n>3 && LHangle(0,1,2)) // pt 1 is not on hull
 {
   POP(); POP(); PUSH(2);
 }
  for(int i=3;i<n;i++){
    while(LHangle(S->next->p,S->p,i)) {POP(); if(S->next ==NULL) break;}
    PUSH(i);
  }
  
 //handle special case when n<=3
 if(n==3 && LHangle(0,1,2)) // pt 1 is not on hull
 {
   POP(); POP(); PUSH(2);
 }
 //stack S contains points on convex hull
  myStack *P = S;
  while(P!=NULL){
   hull[P->p] = true;
   P=P->next;
  }
  //compute totalpts[i] = # convex pts 0..i
  for(int i=0;i<n;i++)
   totalpts[i]=0;
  for(int i=0;i<n;i++)
   if(hull[i]) totalpts[i]++ ;
}

void printHull(){
  cout<<"   convex hull:"<<endl;
  for(int i=0;i<n;i++)
   if(hull[i]) cout<<i<<' '<<x[i]<<' '<<y[i]<<endl;
  cout<<"****"<<endl;
}

void CalcOneBoard(int a, int b){ //compute value of OneBoard[a][b]
    // = best value we can get using one board from pt a to pt b
  double Best = M, slope, intercept, Max;

  for(int i=a;i<n-1;i++)
   if(hull[i])  //can lay a board on pt i
    for(int j=i+1;j<=b;j++)
     if(hull[j]){   //lay board from i to j: calculate max distance
      slope = (y[j]-y[i])/(x[j]-x[i]);
      intercept = y[i] - slope*x[i];
      Max = 0.0;
      for(int k=a;k<=b;k++)
       if(slope*x[k] + intercept - y[k] > Max)
        Max = slope*x[k] + intercept -y[k];
      if (Max < err) Max = 0.0;
      if(Max<Best) Best = Max;
      j=b+1;   //break out of j loop - only adjacent convex pts may be used
     }
  OneBoard[a][b] = Best;
}

void printOneBoard(){
  cout.precision(3);
  cout<<endl;

  for(int i=0;i<n-1;i++){
   for(int j=0;j<n;j++)
     if(j>i){
      if(OneBoard[i][j]==M) cout<<'M'<<' ';
      else  cout<<OneBoard[i][j]<<' ';
     }
     else    cout<<'-'<<' ';
   cout<<endl;
  }
  cout<<endl; 
}

void CalcBest(){
  double MIN, maxi;
  //Best[k][i] = best for posts 0..i using k boards
  //fill in k=1 row
  for(int i=1;i<n;i++)
   Best[1][i]=OneBoard[0][i];

  for(int k=2;k<=b;k++)
   for(int i=k; i<n;i++)  
    if(k+1 <totalpts[i]) //must have k+1 convex pts from 0..i
     Best[k][i] = M;
    else { //find min{max{Best[k-1][j], OneBoard[j+1][i]} 1<=j<i}
     MIN = M;
     for(int j=1;j<i;j++)
      if(Best[k-1][j] !=M && OneBoard[j+1][i]!=M){
       if(Best[k-1][j] >OneBoard[j+1][i]) maxi = Best[k-1][j];
       else maxi = OneBoard[j+1][i];
       if(maxi<MIN) MIN = maxi;
      }
     Best[k][i] = MIN;
    }
}

//round to thousandths
double Round(double x){
  int n = 1000*(x+0.0005);
  return (double)n/1000;
}

int main(){

  cin>>n>>b;
  while(n>0){
   getPoints(n);
   markConvexHull();
   for(int i=0;i<n-1;i++)
    for(int j=i+1;j<n;j++)
     CalcOneBoard(i,j);

   CalcBest();
   cout.setf(ios::fixed | ios::showpoint); 
   cout<<setprecision(3)<<Round(Best[b][n-1])<<endl;
 
   cin>>n>>b;
  }


 return 0;
}
