# coding: utf-8 # 無駄にオブジェクト指向 # ブロックのクラス class Block # 幅です。読み取り専用で取得できるようにします。 attr_reader :width # 初期値に幅を指定します。 def initialize(width) @width = width end end # 箱のクラス class Box # 初期値に幅を指定します。 def initialize(width) # 「空いている幅」です。 # 最初は空なので初期値の幅と同じです。 @empty_width = width # 箱に収めたブロックのリストです。 # 最初は空です。 @block_list = [] end # 箱にブロックをいれます。 # ブロックは箱に詰めていれてきます。 # もし、箱に収まれば true を返します。 # 箱からはみ出す場合は false を返します。 def put(block) # ブロックの幅が空きより以下なのかを調べます。 if @empty_width >= block.width # 箱に入るので、ブロック分空きを減らします。 @empty_width -= block.width # リストにブロックを追加します。 @block_list << block # 収まっているので true を返します。 return true else # 収まらないので false を返します。 return false end end # 箱に入っているブロックの数を返します。 def number_of_blocks # リストの数をそのまま返します。 return @block_list.size end end # 幅を表す L を整数として取得します。 l = gets.to_i # ブロックの個数を表す N を整数として取得します。 # ただし、Ruby ではこの n は使いません。 n = gets.to_i # 各ブロックの幅を表す Wi を整数のリストとして取得します。 w_list = gets.split.map(&:to_i) # 箱のオブジェクトを作ります。 box = Box.new(l) # ブロックのオブジェクトのリストを作ります。 block_list = w_list.map {|w| Block.new(w)} # 箱にブロックが一番はいるのは、ブロックを幅の小さい順から並べた場合です。 # なので、ブロックのリストを幅の小さい順に並び替えます。 block_list.sort! {|a, b| a.width <=> b.width} # 収まらなくなるまで、小さい順から箱に入れていきます。 block_list.each do |block| if box.put(block) # 箱に収まったので次へ next else # 箱に収まらなかったので終了 break end end # 最後に箱の中のブロックの数を出力します。 puts box.number_of_blocks