paizaさんのアルゴリズム問題を解いている最中、回答へ向けての道のりで詰まってしまったのでアドバイスを頂けましたらとおもいます。
尚、ここに掲載する問題は、公式サイトの練習問題として公開されている物なのでスキルチェック用の問題を流出させる目的、意図ではございません。
#問題
練習問題 長テーブルのうなぎ屋 (paizaランク B 相当)
うなぎ屋にはとても大きい長テーブルがあり、テーブルの周りにn個の座席が配置されています。
座席には、時計回りに1, 2, …, nと番号が振られています。
座席はテーブルの周りに配置されているので、座席番号nの座席と1の座席は隣接しています。
今、m個のグループの人達が座席に順番に座りに来ます。i番目(1≦i≦m)のグループの人数をa_i人とします。
彼らは、長テーブルに並んだ座席の内、ある連続するa_i個の座席に一斉に座ろうとします。
ただしお客さんは江戸っ子なので、それら座席のうち、いずれか一つでも既に先客に座られている座席があった場合、
一人も座らずにグループ全員で怒って帰ってしまいます。江戸っ子は気が早いんでぃ。
入力では、i番目のグループが座ろうとする連続した座席の位置は、整数b_iにより指定されます。
i番目のグループは、座席番号b_iの座席を始点として、そこから時計回りにa_i個分の座席に座ろうとします。
最後のグループが座りに来た後、無事に長テーブルの座席に着席出来ている人数を出力するプログラムを作成してください。
##入力される値
入力はm+1行から成ります。
1行目にはn(座席数)とm(グループ数)が半角スペース区切りで入力されます。
i+1行目(1≦i≦m)には2個の整数a_i(グループの人数)とb_i(着席開始座席番号)が半角スペース区切りで入力されます。
#回答コード
ruby
1input_lines = gets.split(" ").map(&:to_i) 2chairs=Array.new(input_lines[0] , false) #席数 falseデフォで座っている席をtrue 3group = input_lines[1] #グループ数 4 5group.times do 6 input = gets.split(" ").map(&:to_i) 7 f_chair=input[1]-1 #組み毎の先頭が座る席番 インデックスのため-1 8 cnt=input[0] #人数 9 if f_chair + cnt <= chairs.size then #座る席が0をまたぐか 10 next if chairs[f_chair , cnt].any? #座ろうとした席が一つでも埋まっていれば退出してしまう 11 chairs[f_chair,cnt].map{|c| c = true} <--ここに問題あり 12 else 13 next if chairs[0 , (f_chair+cnt)%chairs.size].each{|c|c = true} || chairs[f_chair..-1].each{|c|c = true} 14 chairs[0 , (f_chair+cnt)%chairs.size].map{|c| c = true} 15 chairs[f_chair..-1].map{|c| c = true} 16 17 end 18end 19 20#答としてtrueの数を出力 21
#説明
回答のながれとして
0をまたぐ座り方か否かでまず分岐して、そのあとそれぞれ一席でも埋まっていれば出ていてしまうようにしました。
うまく動作しないのが上述した部分で、着席番にtrueをいれたいのですがtrueになりません。(mapメソッドになってますがeachもためしました。)
ruby
1実際の問題の標準入力例) 26 3 32 3 46 1 55 2 6. 7. 8. 9chairs[f_chair,cnt].map{|c| print c = true} 10print chairs 11 12> 13true 14true 15true 16[false, false, false, false, false, false] 17 18true 19[false, false, false, false, false, false] 20 21true 22true 23[false, false, false, false, false, false]
と、trueの代入を行った直後にデバックとして出力結果を試みながら行っていたのですがchairsの値が変化してくれません。
なぜなのかさっぱりなので原因を教えてほしいです。
またこの問題に対するアルゴリズムの考え方はどうかご意見をお聞かせください。
こんな考えもあるよ、短くかけるよ、なども大歓迎です。
駄文ですがよろしくお願いします。

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/01/09 11:51
2018/01/09 14:48