import
java.io.*;
class
GFG{
static
double
distance(
double
[] a,
double
[] b)
{
return
(a[
0
] - b[
0
]) * (a[
0
] - b[
0
]) +
(a[
1
] - b[
1
]) * (a[
1
] - b[
1
]);
}
static
boolean
check(
double
[][] points,
int
k,
double
mid)
{
mid *= mid;
for
(
int
i =
0
; i < points.length; i++)
{
for
(
int
j = i +
1
; j < points.length; j++)
{
double
[] C1 = points[i];
double
[] C2 = points[j];
double
dist = distance(C1, C2);
double
h = Math.sqrt((
4
* mid - dist) / dist);
if
(dist >
4
* mid)
continue
;
double
[] P1 =
new
double
[
2
];
double
[] P2 =
new
double
[
2
];
P1[
0
] = ((C1[
0
] + C2[
0
]) +
h * (C1[
1
] - C2[
1
])) /
2
;
P1[
1
] = ((C1[
1
] + C2[
1
]) +
h * (C2[
0
] - C1[
0
])) /
2
;
P2[
0
] = ((C1[
0
] + C2[
0
]) -
h * (C1[
1
] - C2[
1
])) /
2
;
P2[
1
] = ((C1[
1
] + C2[
1
]) +
h * (C2[
0
] - C1[
0
])) /
2
;
int
cnt1 =
0
;
int
cnt2 =
0
;
for
(k =
0
; k < points.length; k++)
{
if
(distance(P1, points[k]) - mid <=
0.000001
)
cnt1++;
if
(distance(P2, points[k]) - mid <=
0.000001
)
cnt2++;
}
if
(cnt1 >= k || cnt2 >= k)
{
return
true
;
}
}
}
return
false
;
}
static
int
binSearchOnRad(
double
[][] points,
int
k)
{
int
start =
0
, end = (
int
)1e6;
while
(start <= end)
{
int
mid = start + (end - start) /
2
;
if
(check(points, k, mid))
{
end = mid -
1
;
}
else
{
start = mid +
1
;
}
}
return
start;
}
public
static
void
main(String[] args)
{
double
[][] points = { {
8
,
5
}, {
0
,
4
}, {
3
,
6
} };
int
K =
3
;
System.out.println(binSearchOnRad(points, K));
}
}