#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<string>
#include<vector>
#include<cmath>
using namespace std;
#define CLR(arr,v) memset(arr,v,sizeof(arr))
const double INF = 1e-10 ;
struct Node{
double x,y,z;
};
Node node[1005];
double dis[1005][1005];
double comp(Node a,Node b)
{
return (b.x-a.x)*(b.x-a.x)+(b.y-a.y)*(b.y-a.y)+(b.z-a.z)*(b.z-a.z);
}
bool vis[1005];
bool judge(double t,int n,int k)
{
CLR(vis,false);
int cnt = 0;
for(int i = 0;i < n;++i)
{
if(!vis[i])
{
cnt++;
vis[i] = true;
bool ff = false;
for(int j = 0;j < n;++j)
{
if(i == j) continue;
if(!vis[j] && dis[i][j] - t < 0.0000001)
vis[j] = true;
else
{
if(dis[i][j] - t < 0.0000001)
ff = true;
}
}
if(ff) cnt--;
}
}
return cnt >= k;
}
int main()
{
int n,k;
while(scanf("%d%d",&n,&k) != EOF)
{
for(int i = 0;i < n;++i)
scanf("%lf%lf%lf",&node[i].x,&node[i].y,&node[i].z);
int len = 0;
for(int i = 0;i < n;++i)
for(int j = i+1;j < n;++j)
dis[i][j] = dis[j][i] = comp(node[i],node[j]);
double l = 0,r = 3.0,mid;
while(r-l > 0.0000001)
{
mid = (l+r)/2.0;
if(judge(mid,n,k)) l = mid;
else r = mid;
}
printf("%.6lf\n",l);
}
return 0;
}
二分答案,没什么