LoginSignup
0
0

More than 1 year has passed since last update.

[Ruby] AtCoder過去問 B - Nice Shopping

Posted at

はじめに

AtCoder過去問B問題をRubyで解いてみました。
よろしくお願いします。

問題はこちらから確認してください↓

B - Nice Shopping

はじめに入力を受け取ります。
今回は少し面倒でした。

a, b, m = gets.split.map(&:to_i)
a_ary = gets.split.map(&:to_i)
b_ary = gets.split.map(&:to_i)
m_ary = []
m.times do |i|
  m_ary << gets.split.map(&:to_i)
end

割引券の配列m_aryの中は配列の中に配列を入れています。m_aryの中のそれぞれの配列が割引券一枚の条件を示しています。

割引券を使わずとも一番安い組み合わせが存在する可能性がありますので、price_aryという配列を作って代入しておきます。

a, b, m = gets.split.map(&:to_i)
a_ary = gets.split.map(&:to_i)
b_ary = gets.split.map(&:to_i)
m_ary = []
m.times do |i|
  m_ary << gets.split.map(&:to_i)
end

price_ary = [a_ary.min + b_ary.min]

割引券を使った場合の金額もこのprice_aryに入れていきます。
割引券の使った時の金額は例えば1枚目(配列m_aryの先頭)であれば下記のように表せます。

a_ary[m_ary[0][0]-1] + b_ary[m_ary[0][1]-1] - m_ary[0][2]

2枚目(m_aryの2番目も配列)の場合は

a_ary[m_ary[1][0]-1] + b_ary[m_ary[1][1]-1] - m_ary[1][2]

これを利用してtimesメソッドで処理を行います。
割引券の数だけ繰り返すようにして、出来上がった金額はprice_aryに入れていきます。
そして最後にminメソッドでprice_aryの中の一番小さい要素を出力したら完成です。

a, b, m = gets.split.map(&:to_i)
a_ary = gets.split.map(&:to_i)
b_ary = gets.split.map(&:to_i)
m_ary = []
m.times do |i|
  m_ary << gets.split.map(&:to_i)
end

price_ary = [a_ary.min + b_ary.min]
m_ary.length.times do |i|
 price_ary << a_ary[m_ary[i][0]-1] + b_ary[m_ary[i][1]-1] - m_ary[i][2]
end

puts price_ary.min
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0