#【AtCoder 精選過去問を解いてみた Part 2】
何番煎じかわかりませんが、@drkenさんのAtCoder に登録したら次にやること ~ これだけ解けば十分闘える!過去問精選 10 問 ~を解いてみました。
詳細な解説は、@drkenさんの記事を参照ください。
LGTM6000超えの優良記事です。
Rubyを用いて、過去問を解きました。
解答に誤りなどありましたらご指摘いただけますと幸いです。
第4問 : ABC 087 B - Coins (200点)
問題文
あなたは、500円玉をA枚、100円玉をB枚、50円玉をC枚持っています。
これらの硬貨の中から何枚かを選び、合計金額をちょうどX円にする方法は何通りありますか。
同じ種類の硬貨どうしは区別できません。
2通りの硬貨の選び方は、ある種類の硬貨についてその硬貨を選ぶ枚数が異なるとき区別されます。
制約
・0 ≤ A,B,C ≤ 50
・A + B + C ≥ 1
・50 ≤ X ≤ 20,000
・A,B,Cは整数である。
・Xは50の倍数である。
# 整数の入力
a, b, c, x = 4.times.map { gets.to_i }
cnt = 0
# それぞれ繰り返す。
(0..a).each do |i|
(0..b).each do |j|
(0..c).each do |k|
# それぞれの和が、xと同じになるか。
cnt += 1 if i * 500 + j * 100 + k * 50 == x
end
end
end
# 「合計金額をちょうどにするcnt通り」を出力
puts cnt
第5問 : ABC 083 B - Some Sums (200点)
問題文
1以上N以下の整数のうち、10進法での各桁の和がA以上B以下であるものの総和を求めてください。
制約
・1 ≤ N ≤ 10の4乗
・1 ≤ A ≤ B ≤ 36
・入力は全て整数である。
# スペース区切りの整数の入力
n, a, b = gets.chomp.split.map(&:to_i)
ans = 0
# nまで繰り返す。
(1..n).each do |i|
# 文字列に対して、charsメソッドは、1文字ずつ分割
s = i.to_s.chars.map(&:to_i).sum
ans += i if a <= s && s <= b
end
# 「n以下の整数のうち、各桁の和がa以上b以下の総和」を出力
puts ans
第6問 : ABC 088 B - Card Game for Two (200点)
問題文
N枚のカードがあります。i枚目のカードには、aiという数が書かれています。
AliceとBobは、これらのカードを使ってゲームを行います。
ゲームでは、AliceとBobが交互に1枚ずつカードを取っていきます。Aliceが先にカードを取ります。
2人がすべてのカードを取ったときゲームは終了し、取ったカードの数の合計がその人の得点になります。
2人とも自分の得点を最大化するように最適な戦略を取った時、AliceはBobより何点多く取るか求めてください。
制約
・Nは1以上100以下の整数
・ai(1 ≤ i ≤ N)は1以上100以下の整数
# 整数の入力
n = gets.to_i
# スペース区切りの整数の入力し、昇順に並び替えて、逆順にして、大きい順にする。
a = gets.chomp.split.map(&:to_i).sort.reverse
ans = 0
# eachループで回しつつ、それぞれのデータに番号を振る
# even?:偶数であれば真を返す。
a.each_with_index{|item,i| ans += i.even? ? item : -item }
# 「得点差」を出力
puts ans
##おわりに。
Part1よりも難易度が上がった気がします。
以降の問もやっていきます。
Part 1【練習〜第3問】
Part 3【第7問〜第9問】
##参考
AtCoder に登録したら解くべき精選過去問 10 問を Ruby で解いてみた
AtCoder に登録したら解くべき精選過去問 10 問を Ruby・Crystal の両方で動くコードで解いてみた
ありがとうございました。