はじめに
AtCoder過去問B問題をRubyで解いてみました。
よろしくお願いします。
問題はこちらから確認してください↓
B - Contest with Drinks Easy
まずは入力値を受け取る記述を書きます。今回は少々多めでした。
p_xに関しては(4行目以降)二次元配列として受け取っています。
n = gets.to_i
t = gets.split.map(&:to_i)
m = gets.to_i
px = readlines(chomp: true).map{|line| line.split(' ').map(&:to_i)}
僕は頭の整理がしやすいように、pとxはそれぞれの配列に入れ直しました。
n = gets.to_i
t = gets.split.map(&:to_i)
m = gets.to_i
px = readlines(chomp: true).map{|line| line.split(' ').map(&:to_i)}
p_ary = []
x_ary = []
px.each do |p_x|
p_ary << p_x[0]
x_ary << p_x[1]
end
pだけの配列とxだけの配列が作れました。
x_aryとp_aryを使って、問題文通りに配列tを書き換えて、sumメソッドで合計して出力というのを繰り返します。
n = gets.to_i
t = gets.split.map(&:to_i)
m = gets.to_i
px = readlines(chomp: true).map{|line| line.split(' ').map(&:to_i)}
p_ary = []
x_ary = []
px.each do |p_x|
p_ary << p_x[0]
x_ary << p_x[1]
end
cnt = 0
p_ary.each do |x|
t_tmp = t.dup
t_tmp[x-1] = x_ary[cnt]
puts t_tmp.sum
cnt += 1
end
each文の1行目は配列tを初期化しているという感じです。
おまけ
実は最初、each文の1行目はt_tmp = t
としていたのですが、t_tmpの中が初期化できなかったんですね。。。
おそらくrubyという言語の構造の話だとは思うのですが、t_tmp=tという記述でt_tmpとtが同じものとして認識されているので、t_tmpを加工したらtも加工されている。。。?ということなのでしょうか
配列tをコピーするにはdupメソッドをつけてやればt_tmpとtは別物と判断してくれて、初期化できました。