Problem:
Score : 600 points

Problem Statement

Takahashi wants to grill N pieces of meat on a grilling net, which can be seen as a two-dimensional plane. The coordinates of the i-th piece of meat are \left(x_i, y_i\right), and its hardness is c_i.

Takahashi can use one heat source to grill the meat. If he puts the heat source at coordinates \left(X, Y\right), where X and Y are real numbers, the i-th piece of meat will be ready to eat in c_i \times \sqrt{\left(X - x_i\right)^2 + \left(Y-y_i\right)^2} seconds.

Takahashi wants to eat K pieces of meat. Find the time required to have K or more pieces of meat ready if he put the heat source to minimize this time.

Constraints

All values in input are integers.

1 \leq N \leq 60

1 \leq K \leq N

-1000 \leq x_i , y_i \leq 1000

\left(x_i, y_i\right) \neq \left(x_j, y_j\right) \left(i \neq j \right)

1 \leq c_i \leq 100

Input

Input is given from Standard Input in the following format:

N K
x_1 y_1 c_1
\vdots
x_N y_N c_N

Output

Print the answer.

It will be considered correct if its absolute or relative error from our answer is at most 10^{-6}.

Sample Input 1

4 3
-1 0 3
0 0 3
1 0 2
1 1 40

Sample Output 1

2.4

If we put the heat source at \left(-0.2, 0\right), the 1-st, 2-nd, and 3-rd pieces of meat will be ready to eat within 2.4 seconds. This is the optimal place to put the heat source.

Sample Input 2

10 5
-879 981 26
890 -406 81
512 859 97
362 -955 25
128 553 17
-885 763 2
449 310 57
-656 -204 11
-270 76 40
184 170 16

Sample Output 2

7411.2252

Solution in C++14 (GCC 5.4.1) (judge verdict: Wrong Answer)

#include<bits/stdc++.h>
using namespace std;

template <typename T> T sq(T a) { return a * a; }

int main() {
	ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0);
	int N, K; cin >> N >> K;
	vector<pair<pair<int, int>, int>> circles(N);
	for (auto& it : circles) {
		cin >> it.first.first >> it.first.second >> it.second;
	}

	double mi = 0;
	double ma = 1e5;
	for (int z = 0; z < 200; z++) {
		double md = (mi + ma) / 2;
		bool good = false;
		auto checkPt = [&](double x, double y) { 
			int cnt = 0;
			for (auto it : circles) {
				cnt += hypot(x - it.first.first, y - it.first.second) * it.second <= md;
			}
			if (cnt >= K) good = true;
		};

		for (int i = 0; i < N; i++) {
			checkPt(circles[i].first.first, circles[i].first.second);
		}
		for (int i = 0; i < N; i++) {
			for (int j = i+1; j < N; j++) {
				double x1, y1, x2, y2;
				tie(x1, y1) = circles[i].first, tie(x2, y2) = circles[j].first;
				double r1 = md / circles[i].second, r2 = md / circles[j].second;
				double d = hypot(x1 - x2, y1 - y2);
				if (r1 + r2 + d <= 2 * max({r1, r2, d})) {
					continue;
				}
				double parallel = (sq(d) + sq(r1) - sq(r2)) / 2 / d;
				double perp = sqrt(max(0., sq(r1) - sq(parallel)));
				//perp = max(0., perp - 1e-7);
				double xmid = x1 + (x2 - x1) / d * parallel;
				double ymid = y1 + (y2 - y1) / d * parallel;
				double xa = xmid + (y2 - y1) / d * perp, ya = ymid - (x2 - x1) / d * perp;
				checkPt(xa, ya);
				double xb = xmid - (y2 - y1) / d * perp, yb = ymid + (x2 - x1) / d * perp;
				checkPt(xb, yb);
			}
		}
		if (good) {
			ma = md;
		} else {
			mi = md;
		}
	}
	cout << fixed << setprecision(10) << ma << '\n';

	return 0;
}