##はじめに
AtCoder過去問C問題をRubyで解いてみました。
問題はこちらから確認してください。↓
##C - Alchemist
なんだかゲームとかで使われそうなアルゴリズムですね。
入力受け取りから書いていきます。
n = gets.to_i
worth = gets.split.map(&:to_i).sort!
ちなみに私の解き方では1行目のnは使いません。
2行目は複数の値をworth(価値)という変数に配列として代入しています。
また.sort!
をつけてます。これは配列の中身を昇順に並び替えています。
この問題の肝は、どの順番に合成していけば最大価値を持ったの具材が作れるかです。
その条件は小さいものから、処理を行うことです。
配列を昇順に並び替えたのはそのためです。
shiftメソッドがかなりいきてきます。
ちなみにshiftの使い方はこちらにまとめております。↓
n = gets.to_i
worth = gets.split.map(&:to_i).sort!
ans = worth.shift
while worth != []
ans = (ans + worth.shift)/2.to_f
end
puts ans
問題文の足して2で割るという処理は合成された時のみなので一番初めの元となる具材には適用しません。
ですのではじめにansに一番小さい要素(配列の先頭)を代入しておきます。
while文の条件式に配列worthが空になるまで処理を繰り返すようにします。
処理の中身はworthの中で一番小さい要素(配列の先頭)を取り出して、ansに足して、2で割ってansに代入です。
worthの中が空になったらansに一番価値が大きい方法で合成された具材の価値が入っているはずです。