6月21日に開催されたAtCoder Beginner Contest 171。
B問題の復習。
各問題の制約や入力・出力例はリンク先(AtCoderのサイト)へ。
B - Mix Juice
問題文
ある店でN 種類の果物、果物 1,…,N が売られており、それぞれの価格は一個あたり p1,…,pN 円です。
この店で K 種類の果物を一個ずつ買うとき、それらの合計価格として考えられる最小の金額を求めてください。入力
入力は以下の形式で標準入力から与えられる。
N K
p1 p2 … pN
提出したコード
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
に入れてソート。変数ans
とi
を用意して0
を代入しておく。
while
でi
がk
より小さい間繰り返し処理し、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
感想
今回もいろんな書き方があって勉強になった。
もっとレベルアップするにはアルゴリズムも勉強しないとだめかな。