0w1

GCJ 2017 R1B A. Steed 2: Cruise Control ( Binary Search )

Dashboard - Round 1B 2017 - Google Code Jam

嗯..? 好像根本就不用二分搜

題意:
T 筆測資。你在數線上的原點,目的地是 D。除了你現在騎著的馬,一共有 N 隻馬,任兩隻不共享位置的處於某整數位置,並有一個最高速度的屬性描述。當後面的馬追上前面的馬時,後面這隻馬會很有禮貌的做最低限度的減速,使得不會超過前面的馬。問你的馬最高時速可以是多少,以至於過程中不會減速。

制約:
1 ≤ T ≤ 100.
1 ≤ N ≤ 1000.
0 < Ki < D ≤ 1e9, for all i.
Ki ≠ Kj, for all i ≠ j. (No two horses start in the same position.)
1 ≤ Si ≤ 10000.

解法:
二分搜答案,獨立詢問是否會超過任一隻馬即可。

時間 / 空間複雜度:
O( N lg D )

T = int( input() )
for ti in range( 1, T + 1, 1 ):
  D, N = map( int, input().split() )
  K = []
  S = []
  for i in range( N ):
    k, s = map( int, input().split() )
    K.append( k )
    S.append( s )
  lb, ub = 0.0, 1e30
  for i in range( 200 ):
    mid = ( lb + ub ) / 2
    ng = False
    for i in range( 0, N ):
      if mid <= S[ i ]: continue
      if K[ i ] / ( mid - S[ i ] ) >= ( D - K[ i ] ) / S[ i ]: continue
      ng = True
      break
    if ng:
      ub = mid
    else:
      lb = mid
  print( "Case #%d: %.7f" % ( ti, lb ) )