唯物是真 @Scaled_Wurm

プログラミング(主にPython2.7)とか機械学習とか

Google Code Jam Japan 2011予選(問題Aだけ)

問題A. カードシャッフル

C枚のカードをM回カットしたとき,W番目にあるカードの番号を求める.
カットはA[j]番目からB[j]枚のカードを山札の一番上に置く.

解法

最後の時点でWにあるカードが最初の時点でどこにあるのかを,カットを逆回しして計算

with open("A-large-practice.in") as f:
  T = int(f.readline().strip())
  for i in xrange(T):
    M, C, W = map(int, f.readline().strip().split(" "))
    A = [0] * C
    B = [0] * C
    for j in xrange(C):
      A[j], B[j] = map(int, f.readline().strip().split(" "))
    for j in xrange(C - 1, -1, -1):
      if W <= B[j]:
        W += A[j] - 1
      elif A[j] + B[j] - 1 >= W:
        W -= B[j]
    print "Case #" + str(i + 1) + ": " + str(W)