読者です 読者をやめる 読者になる 読者になる

水面下の夢

競プロやイラストに興味があります.メインブログがここ.ソシャゲの話はこっち(http://ameblo.jp/0n0-yumechi/).ブログアイコンはYaQ(@8_9_00)さんから.

AOJ1129 Hanafuda Shuffle

AOJ Ruby 競技プログラミング

回答

http://judge.u-aizu.ac.jp/onlinejudge/review.jsp?rid=1587269

問題文のとおりに実装するだけで良いのだが,思わぬところでハマったので,備忘録的にブログを書いておく.

まず,rubyを用いて,[1,2,3,4,5]のような配列を作る場合ですが,

ngarray = [1..5]
okarray = (1..5).to_a

となります….この例のngarrayだとRangeクラスが1つだけ格納される形になるので,思ったような動作をしません.ああぁんなんで…(日をまたいで1時間以上悩んでいました)

参考:
rubyで連番の配列作ろうとして気づいたアホな思いこみ - みんなのちからになりたい
Class: Array (Ruby 2.2.3)

で,それを解決したうえで,部分的な配列を作る場合を確認.

array = [0..5]
subarray = array[2..3] # => [2, 3]

このように書く.配列同士は"+"でくっつけられる.ドットの数が2つか,3つかで範囲が変わるのは少しわかりづらい感じがしますね.どっちか片方だけでいいんじゃないかな….


っていう事前の知識があれば一瞬で解けたんじゃないですかね….


それと,以下のoutputに関する文で,以下の点を読み落としていて,勘違いをしていた.

最初に一番下を1番として順にn番まで の札が積み上げられた山を仮定して,

こことても重要です.私は一番下をnにして積んでいたので,sampleと答えが合わず四苦八苦しました.
教訓:問題文をよく読もう.

while true do
    n, r = gets.split(" ").map(&:to_i)
    if n == 0 && r == 0
        break
    end
    arr = (1..n).to_a.reverse
    r.times do
        p, c = gets.split(" ").map(&:to_i)
        p -= 1
        ta = arr[p...p+c] + arr[0...p] + arr[p+c..n]
        arr = ta
    end
    puts arr[0]
end