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 Scala (judge verdict: Accepted)

import scala.annotation.tailrec
import scala.collection.{immutable, mutable}

import scala.math._
object Main extends App {

  import scala.io.StdIn._
  loop()
  @tailrec def loop(): Unit = {
    val n = readInt
    val minDiff = 1e-12
    if (n == 0) return
    val shops = Array.fill(n){
      val Array(x, y, v) = readLine.trim.split(' ').map(_.toInt)
      SweetsShop(Point(x, y), v)
    }
    var min = 0d
    var max = 150d
    while (min + minDiff < max) {
      val mid = (min + max) / 2
      val circles = shops.map{_.reachableCircle(mid)}
      if ((circles.map{_.center} ++ circles.combinations(2).flatMap{a ⇒ a(0).crossPoints(a(1))}).exists(p ⇒ circles.forall(_.contains(p)))) {
        max = mid
      }else {
        min = mid
      }
    }
    println(f"$max%.10f")
    loop()
  }
  implicit class Wrap[T](val value: T) extends AnyVal {
    @inline def tap(func: T ⇒ Unit): T = {
      func(value)
      value
    }
  }
}
case class Angle(sin: Double, cos: Double) {
  def toRad(): Double = math.atan2(sin, cos)
  def +(that: Angle): Angle = Angle(sin * that.cos + cos * that.sin, cos * that.cos - sin * that.sin)
  def -(that: Angle): Angle = Angle(sin * that.cos - cos * that.sin, cos * that.cos + sin * that.sin)
  def unary_-(): Angle = Angle(-sin, cos)
}
object Angle {
  def fromRad(rad: Double): Angle = Angle(sin(rad), cos(rad))
}
case class Section(from: Double, to: Double) {
  def cutOff(that: Section): List[Section] = {
    if (that.to < from || to < that.from) List(this)
    else if (contains(that.from) && contains(that.to)) List(Section(from, that.from), Section(that.to, to))
    else if (that.contains(from) && that.contains(to)) Nil
    else if (contains(that.from)) List(Section(from, that.from))
    else List(Section(that.to, to))
  }
  def contains(that: Double): Boolean = from <= that && that <= to
  def length: Double = to - from
}
case class Point(x: Double, y: Double) {
  def +(that: Point): Point = Point(x + that.x, y + that.y)
  def -(that: Point): Point = Point(x - that.x, y - that.y)
  def toVec(): Vector = Vector(x, y)
  def shift(vec: Vector): Point = Point(x + vec.x, y + vec.y)
  def distanceFrom(that: Point): Double = (this - that).toVec().length
}
case class Vector(x: Double, y: Double) {
  def toAngle(): Angle = Angle.fromRad(atan2(y, x))
  def length: Double = sqrt(x * x + y * y)
}
case class Circle(center: Point, radius: Double) {
  def crossPoints(that: Circle): List[Point] = {
    val dist = center.distanceFrom(that.center)
    if (dist >= radius + that.radius || dist + min(radius, that.radius) <= max(radius, that.radius)) Nil
    else {
      val cos = (radius * radius + dist * dist - that.radius * that.radius) / 2 / radius / dist
      val angle = Angle(sqrt(1 - cos * cos), cos)
      val baseAngle = (that.center - center).toVec().toAngle()
      val pa = baseAngle - angle
      val pb = baseAngle + angle
      List(center + Point(pa.cos * radius, pa.sin * radius), center + Point(pb.cos * radius, pb.sin * radius))
    }
  }
  def contains(that: Circle): Boolean = {
    center.distanceFrom(that.center) + that.radius <= radius
  }
  def contains(that: Point): Boolean = {
    center.distanceFrom(that) <= radius + 1e-6
  }
}

case class SweetsShop(position: Point, velocity: Int) {
  def reachableCircle(time: Double): Circle = Circle(position, velocity * time)
}