#【AtCoder 精選過去問を解いてみた Part 3】
何番煎じかわかりませんが、@drkenさんのAtCoder に登録したら次にやること ~ これだけ解けば十分闘える!過去問精選 10 問 ~をRを解いてみました。
詳細な解説は、@drkenさんの記事を参照ください。
LGTM6000超えの優良記事です。
Rubyを用いて、過去問を解きました。
解答に誤りなどありましたらご指摘いただけますと幸いです。
第7問 : ABC 085 B - Kagami Mochi (200点)
問題文
X段重ねの鏡餅(X ≥ 1)とは、枚の円形の餅を縦に積み重ねたものであって、どの餅もその真下の餅より直径が小さい(一番下の餅を除く)もののことです。
例えば、直径10、8、6センチメートルの餅をこの順に下から積み重ねると3段重ねの鏡餅になり、餅を一枚だけ置くと1段重ねの鏡餅になります。
あなたはN枚の円形の餅を持っていて、そのうちi枚目の餅の直径はdiセンチメートルです。
これらの餅のうち一部または全部を使って鏡餅を作るとき、最大で何段重ねの鏡餅を作ることができるでしょうか。
制約
・1 ≤ N ≤ 100
・1 ≤ di ≤ 100
・入力値はすべて整数である。
# 整数の入力
n = gets.to_i
ans = n.times.map { gets.to_i }
# 「何段積み上げられるか」を出力
# uniqメソッド:配列から重複を取り除く
puts ans.uniq.length
第8問 : ABC 085 C - Otoshidama (300点)
問題文
日本でよく使われる紙幣は、10000円札、5000円札、1000円札です。
以下、「お札」とはこれらのみを指します。
お年玉袋にはお札がN枚入っていて、合計でY円だったそうですが、嘘かもしれません。
このような状況がありうるか判定し、ありうる場合はお年玉袋の中身の候補を一つ見つけてください。
なお、お年玉袋は十分大きかったものとします。
制約
・1 ≤ N ≤ 2000
・1000 ≤ Y ≤ 2×10の7乗
・Nは整数である。
・Yは1000の倍数である。
# スペース区切りの整数の入力
n, y= gets.chomp.split.map(&:to_i)
# ありえない場合の初期値:-1
xi, xj, xk = -1, -1, -1
# nまで繰り返す。
(0..n).each do |i|
(0..n - i).each do |j|
if i * 10000 + j * 5000 + (n - i - j) * 1000 == y
xi, xj, xk = i, j, n - i - j
end
end
end
# 出力
puts "#{xi} #{xj} #{xk}"
第9問 : ABC 049 C - Daydream (300点)
問題文
英小文字からなる文字列Sが与えられます。
Tが空文字列である状態から始め、以下の操作を好きな回数繰り返すことで、S = Tとすることができるか判定してください。
・Tの末尾に dream dreamer erase eraser のいずれかを追加する。
制約
・1 ≤ |S| ≤ 10の5乗
・Sは英小文字からなる。
# データの入力
s = gets.chomp.to_s
# %w:配列を要素はスペース区切りで作る。
# gsub:マッチした部分をすべて置換
%w(eraser erase dreamer dream).each{ |w| s = s.gsub(w," ") }
s = s.gsub(" ","")
# 出力
puts s == "" ? "YES" : "NO"
##おわりに。
今回は、第10問は解くのをやめました。
まだまだ理解が浅いので復習します。
その後、第10問を解きます
Part 1【練習〜第3問】
Part 2【第4問〜第6問】
##参考
AtCoder に登録したら解くべき精選過去問 10 問を Ruby で解いてみた
AtCoder に登録したら解くべき精選過去問 10 問を Ruby・Crystal の両方で動くコードで解いてみた
ありがとうございました。