Problem:
アリの巣箱の形状

求悟君は夏休みの自由研究としてアリの巣の観察を行うことにしました。彼のおじいちゃんが孫のために用意してくれた観察用の透明ケースはとてもユニークで、図1のような形をしています。

図１

このケースは、2枚の合同な凸多角形 s1、s2 と何枚かの長方形で構成されています。s1、s2 以外のいずれかの長方形の面を床に接するように置きます。観察を始めた求悟君は、入っている土の量が同じにもかかわらず、底面の選び方によって土の高さが変わることに気付きました（図2）。

図２

求悟君は、ケースの置き方によって、どのくらい高くなるか知りたくなりました。凸多角形 s1 の形、s1 と s2 間の距離 d、土の体積 V を入力とし、土の高さの最大値を出力するプログラムを作成してください。土は、ケースの底面を床に置くとすぐに水平になるものとします。透明ケースの s1 の形は、二次元の座標平面上の n 個の頂点で与えられます。これらの頂点は、反時計回りの順番で入力されます。n は 3 以上 100 以下で、d と V はそれぞれ 1 以上 10,000 以下の整数とします。また、多角形の頂点の座標 (x, y) の x、y はそれぞれ -1,000 以上 1,000 以下の整数とします。Vはケースの体積を超えません。

入力

複数のデータセットの並びが入力として与えられます。入力の終わりはゼロみっつの行で示されます。各データセットは以下のとおりです。

1 行目 n d V（整数 整数 整数；半角空白区切り）

2 行目 第 1 の頂点の座標 x y（整数 整数；半角空白区切り）

3 行目 第 2 の頂点の座標

:

n+1 行目 第 n の頂点の座標

データセットの数は 20 を超えません。

出力

入力データセットごとに、土の高さの最大値を出力します。答えには 0.00001 を越える誤差があってはいけません。

入力例

4 1 1
0 0
1 0
1 2
0 2
0 0 0

出力例

1.000000

Solution in Ruby (judge verdict: Wrong Answer)

EPS = 1e-9

class Polygon
  Point = Struct.new(:x, :y)
  # ???????¨?????????????????????????????????????
  def initialize(point)
    @point = Array.new
    @bottom = 0
    point.each do |p| add(*p) end
  end
  # ????????????
  def add(x, y)
    @point << Point.new(x, y)
  end
  # ????????°?????????
  def size()
    @point.size
  end
  # ????¨???????????????¢
  def rotate!
    @bottom += size + 1
    @bottom %= size
    x, y = @point[@bottom].x, @point[@bottom].y
    @point.each do |p|
      p.x -= x
      p.y -= y
    end
    angle = -Math::atan2(@point[(@bottom + 1) % size].y, @point[(@bottom + 1) % size].x)
    @point.each do |p|
      p.x, p.y = p.x * Math::cos(angle) - p.y * Math::sin(angle), p.x * Math::sin(angle) + p.y * Math::cos(angle)
    end
  end
  # ????§???¢??? y = h ?????´?????§????????????, ??????????????????
  def split(h)
    result = Polygon.new([])
    (@point + [@point.first]).each_cons(2) do |p1, p2|
      if p1.y + EPS < h && p2.y + EPS < h
        result.add(p1.x, p1.y)
      elsif p1.y + EPS < h && h + EPS < p2.y
        result.add(p1.x, p1.y)
        result.add((p2.x - p1.x) * (h - p1.y) / (p2.y - p1.y) + p1.x, h)
      elsif h + EPS < p1.y && p2.y + EPS < h
        result.add((p1.x - p2.x) * (h - p2.y) / (p1.y - p2.y) + p2.x, h)
      end
    end
    result
  end
  # ????§???¢ (0, 0), p1, p2 ?????¢?????????
  def area()
    (@point + [@point.first]).each_cons(2).map{|p1, p2| (p1.x * p2.y - p1.y * p2.x).abs / 2.0}.inject(:+)
  end
  # ????§???¢?????¢?????? s ?????????????????????????????????
  def height(s)
    low = 0.0
    high = 2000.0
    until high - low < EPS
      middle = (low + high) / 2.0
      split(middle).area() + EPS < s ? (low = middle) : (high = middle)
    end
    low
  end
end

until (n, d, v = gets.split.map(&:to_i)).all?(&:zero?)
  s = v.to_f / d.to_f
  polygon = Polygon.new(n.times.map{gets.split.map(&:to_f)}.map{|x, y| [x, y]})
  answer = 0
  (1 + n).times do
    polygon.rotate!
    answer = [answer, polygon.height(s)].max
  end
  p answer
end