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;
 
#define pb push_back
#define ll long long
#define maxn 300005
#define fr(i,j,k) for(int i=j;i<k;i++)
#define f(n) fr(i,0,n)
#define f1(n) fr(i,1,n+1)
#define ms(i) memset(i,0,sizeof(i));
#define ms1(i) memset(i,-1,sizeof(i));
vector<double>x,y,c;
vector<double>xp,yp;
double ans = 1e18;
int n, m;
double check(double xx,double L,double R) {
    double l = L;double r = R;
    int t = 60;
    double mi = 1e18;
    while(t--) {
        double lm = (l * 2 + r)/3;
        double rm = (r * 2 + l)/3;
        vector<double>d1, d2;
        for (int i = 0 ; i < n ; i++) {
            double dis = sqrt((xx-x[i]) * (xx-x[i]) + (lm-y[i]) * (lm-y[i])) * c[i];
            d1.pb(dis);
            dis = sqrt((xx-x[i]) * (xx-x[i]) + (rm-y[i]) * (rm-y[i])) * c[i];
            d2.pb(dis);
        }
        sort(d1.begin(),d1.end());
        sort(d2.begin(),d2.end());
        ans = min(ans, d1[m-1]);
        ans = min(ans, d2[m-1]);

        if (d1[m-1] < d2[m-1]) {
            mi = min(mi,d1[m-1]);
            r = rm;
        }
        else {
            mi = min(mi,d2[m-1]);
            l = lm;
        }
    }
    return mi;
}
            
int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    
    
    cin >> n >> m;
    for (int i = 0 ; i < n ; i++) {
        double add;
        cin >> add;
        x.pb(add);
        xp.pb(add);
        cin >> add;
        y.pb(add);
        yp.pb(add);
        cin >> add;
        c.pb(add);
        
       
    }
    sort(xp.begin(),xp.end());
    sort(yp.begin(),yp.end());
    for (int i = 1 ; i < xp.size();i++){
        for (int j = 1 ; j < yp.size() ; j++){
            int t = 60;
            double l =xp[i-1] , r = xp[i];
            while(t--){
                double lm = (l * 2 + r)/3;
                double rm = (r * 2 + l)/3;
                if(check(lm,yp[j-1],yp[j]) < check(rm,yp[j-1],yp[j])) {
                    r = rm;
                }
                else {
                    l = lm;
                }
            }
        }
    }
    cout << fixed << setprecision(10) << ans << '\n';
}