Problem:
KND Runs for Sweets

Problem

KND君は会津大学に在籍する学生プログラマである。彼は甘党であることで知られている。彼はとある市に1年間滞在することになり、その期間中に市内にある N 箇所の甘味処をすべて回りたいと思っている。なのでこの1年間の住む場所は甘味処を回るのに一番適した場所がいいと考えている。彼の隣人であるあなたは、各甘味処への最悪の移動時間が最小になる場所を探す事になった。この甘味処がある市は簡単のため二次元平面で表すことにする。彼は目的の甘味処へのモチベーションの違いにより、単位時間あたりの移動距離が変化する。また、彼はどんな場所にでも（たとえ甘味処と同じ場所であろうと）住むつもりでいる。KND君は甘味に関しては妥協を許さないのである。

Input

入力は複数のテストケースからなる。
ひとつのテストケースは以下のな形式で与えられる。
入力の終了を N = 0 のとき示す。

N
x1 y1 v1
x2 y2 v2
...
xN yN vN

ここで、

N:甘味処の数

xi:i番目の甘味処のx座標

yi:i番目の甘味処のy座標

vi:i番目の甘味処へ移動するときの単位時間あたりの移動距離

である。

Constraints

入力は以下の条件を満たす。

入力はすべて整数。

2 ≤ N ≤ 100

0 ≤ xi, yi ≤ 100

1 ≤ vi ≤ 100 ( 1 ≤ i ≤ N )

xi ≠ xj or yi ≠ yj ( ただし1 ≤ i < j ≤ N )

Output

各テストケースにつき最悪の移動時間の最小値を一行に出力せよ。この値はジャッジ出力の値と10-5より大きい差を持ってはならない。

Sample Input

2
1 1 1
2 2 1
4
1 1 3
3 1 3
4 2 1
1 5 3
0

Sample Output

0.70710678
1.06066017

Solution in C (judge verdict: Accepted)

// AOJ 1093: KND Runs for Sweets
// 2017.11.16 bal4u@uu

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#define KAI 70
int x[101], y[101], v[101]; int n;
int max;

double fx(double a, double b)
{
	int i;
	double d, max;
	
	max = 0;
	for (i = 0; i < n; i++) {
		d = hypot(a-x[i], b-y[i]) / v[i];
		if (d > max) max = d;
	}
	return max;
}

double srchy(double x)
{
	int i;
	double l, r, a, b;

	l = 0, r = max;
	i = KAI; while (i--) {
		a = (2*l + r) / 3;
		b = (l + 2*r) / 3;
		if (fx(x, a) < fx(x, b) ) r = b;
		else                      l = a;
	}
	return fx(x, (l+r)/2);
}

double srch3()
{
	int i;
	double l, r, a, b;
	
	l = 0, r = max;
	i = KAI; while (i--) {
		a = (2*l + r) / 3;
		b = (l + 2*r) / 3;
		if (srchy(a) < srchy(b)) r = b;
		else                     l = a;
	}
	return srchy((l+r) / 2) ;
}

int main()
{
	int i;

	while (scanf("%d", &n) && n > 0) {
		max = 0;
		for (i = 0; i < n; i++)	{
			scanf("%d%d%d", x+i, y+i, v+i);
			if (x[i] > max) max = x[i];
			if (y[i] > max) max = y[i];
		}
		printf("%.8f\n", srch3());
	}
	return 0;
}