#include <iostream>
#include <cmath>
#include <algorithm>
#include <iomanip>
using namespace std;
long long v[200005];
//int opt[200005];
long long spar[200005];
long long lz[1800005];
long long mijloc[1800005];
long long drr[1800005];
pair<long double,int> dp[200005];
long double calc(int i,int j)
{
if(i>=j)
{
return 1e9;
}
return dp[i].first+sqrtl((spar[j]-spar[i])*(j-i));
}
void push(int node,int st,int dr)
{
if(lz[node]!=-1)
{
mijloc[node]=lz[node];
drr[node]=lz[node];
if(st!=dr)
{
lz[node*2]=lz[node];
lz[node*2+1]=lz[node];
drr[node*2]=lz[node];
drr[node*2+1]=lz[node];
mijloc[node*2+1]=lz[node];
mijloc[node*2+1]=lz[node];
}
}
lz[node]=-1;
}
void update(int node,int st,int dr,int from)
{
push(node,st,dr);
if(dr<st)
{
return;
}
int mij=(st+dr)/2;
if(st==dr)
{
if(calc(from,mij)<=calc(mijloc[node],mij))
{
lz[node]=from;
push(node,st,dr);
}
return;
}
if(calc(from,mij)<=calc(drr[node*2],mij))
{
lz[node*2+1]=from;
push(node*2+1,mij+1,dr);
update(node*2,st,mij,from);
}
else
{
update(node*2+1,mij+1,dr,from);
}
drr[node]=drr[node*2+1];
mijloc[node]=drr[node*2];
}
int qr(int node,int st,int dr,int poz)
{
push(node,st,dr);
if(st==dr)
{
return mijloc[node];
}
int mij=(st+dr)/2;
if(poz<=mij)
{
return qr(node*2,st,mij,poz);
}
else
return qr(node*2+1,mij+1,dr,poz);
}
int n;
int check(long double plm)
{
long double valus;
int from;
lz[1]=0;
push(1,2,3);
for(int i=1; i<=n; i++)
{
from=qr(1,1,n,i);
dp[i].first=calc(from,i)+plm;
dp[i].second=dp[from].second+1;
update(1,1,n,i);
}
return dp[n].second;
}
int main()
{
int i,j,k,l,m,val;
long double st=-1e9,dr=1e9,mij;
cin>>n>>m;
for(i=1; i<=n; i++)
{
cin>>v[i];
}
sort(v+1,v+n+1);
for(i=1; i<=n; i++)
{
spar[i]=spar[i-1]+v[i];
}
for(i=1; i<=90; i++)
{
mij=(st+dr)/2;
val=check(mij);
if(val==m)
{
break;
}
else if(val>m)
{
st=mij;
}
else
{
dr=mij;
}
}
cout<<fixed<<setprecision(12)<<dp[n].first-dp[n.second]*mij;
return 0;
}