Hatena::Grouptopcoder

kojingharangの日記 RSSフィード

 | 

2012-05-21

SRM 453 Div1 500 EllysRivers

20:22 | SRM 453 Div1 500 EllysRivers - kojingharangの日記 を含むブックマーク はてなブックマーク - SRM 453 Div1 500 EllysRivers - kojingharangの日記 SRM 453 Div1 500 EllysRivers - kojingharangの日記 のブックマークコメント

  • greedy解がなぜうまくいくのか分からなかったので考えてみた
  • 「(x, ?) から (x+width, ?+y) に行く時に比べて (x+width, ?+y+1) に行く時ではどれだけ長くなるか」を各 x, y について求めておく
  • 上記は、x が固定なら y が大きいほど大きい
>>> import math
>>> [ math.hypot(3,y+1)-math.hypot(3, y) for y in range(10) ]
[0.16227766016837952, 0.4432736152956096, 0.6370894116552956, 0.7573593128807152, 0.8309518948453007, 0.8772520376540687, 0.9075691733645392, 0.9282306394536217, 0.9428292351876078, 0.9534735284054126]
  • この数列の 0〜Y の和は、「(x, ?) から (x+width, ?) に行く時に比べて (x+width, ?+Y) に行く時ではどれだけ長くなるか」なので、
  • x → x+width と移動するときに、同時に Y 個上に移動するときの増加コストと同じ
  • この数列の小さい方から Y 個の和は、0〜Y の和と等しい (ポイント)
  • なので、全部の差分をソートして小さい方から length 個足せば、全部で length 個上にいくときの最小増加分がわかる
  • ということみたいだ。すげ〜
 |