B - Mix Juice(ABC171復習)

6月21日に開催されたAtCoder Beginner Contest 171

B問題の復習。

各問題の制約や入力・出力例はリンク先(AtCoderのサイト)へ。

B - Mix Juice

問題文
ある店でN 種類の果物、果物 1,…,N が売られており、それぞれの価格は一個あたり p1,…,pN 円です。
この店で K 種類の果物を一個ずつ買うとき、それらの合計価格として考えられる最小の金額を求めてください。

入力
入力は以下の形式で標準入力から与えられる。
N K
p1 p2 … pN

B - Mix Juice

提出したコード

n, k = gets.split.map(&:to_i)
prices = gets.split.map(&:to_i).sort
ans = 0
i = 0
while i < k
  ans += prices[i]
  i += 1
end
puts ans

結果:AC(正解) 実行時間:69 ms

果物の値段を配列pricesに入れてソート。変数ansiを用意して0を代入しておく。

whileikより小さい間繰り返し処理し、pricesの小さい方から順にansに加えていく。

最後にansを出力。

他の書き方

timesがこういう使い方できるの知らなかった…!

5.times { |n| print n }
#=> 01234

whileよりシンプルにかける。

n, k = gets.split.map(&:to_i)
prices = gets.split.map(&:to_i).sort
ans = 0
k.times do |i|
  ans += prices[i]
end
puts ans

Integer#times (Ruby 2.7.0 リファレンスマニュアル)


配列のインデックスを範囲オブジェクトで指定。

ary = [1, 3, 5, 7, 9]
ary[1..3]  #=> [3, 5, 7]
ary[1...3]  #=> [3, 5]

これを使うとこんなに短く書ける。

n, k = gets.split.map(&:to_i)
prices = gets.split.map(&:to_i).sort
puts prices[0...k].sum

感想

今回もいろんな書き方があって勉強になった。

もっとレベルアップするにはアルゴリズムも勉強しないとだめかな。