AtCoder初心者がやるべき問題集、AtCoder Beginners Selectionに挑戦。
各問題の制約や入出力例などは引用元リンク(AtCoderのサイト)へ。
ABC087B - Coins
問題文
あなたは、500 円玉を A 枚、100 円玉を B 枚、50 円玉を C 枚持っています。 これらの硬貨の中から何枚かを選び、合計金額をちょうど X 円にする方法は何通りありますか。
同じ種類の硬貨どうしは区別できません。2 通りの硬貨の選び方は、ある種類の硬貨についてその硬貨を選ぶ枚数が異なるとき区別されます。入力
入力は以下の形式で与えられる。
A
B
C
X
ACコード
a = gets.to_i b = gets.to_i c = gets.to_i x = gets.to_i ans = 0 (0..a).each do |i| (0..b).each do |j| (0..c).each do |k| ans += 1 if (500 * i) + (100 * j) + (50 * k) == x end end end puts ans
実行時間:62 ms
前回ぐらいから難しくなってきた。ちょっとカンニングした。ごめんなさい。
each
を入れ子にするとどういうことが起こるか。
(例)a = 2, b = 2, c = 2, x = 100
- まず、1回目は a = 0, b = 0, c = 0 で
ans += 1 if (500 * i) + (100 * j) + (50 * k) == x
が評価される。答えは 0 なので ans は 0 のまま。 - 次は、a = 0, b = 0, c = 1 で評価。50。
- 次は、a = 0, b = 0, c = 2 で評価。x = 100 なので ans = 1。
- 次は、a = 0, b = 1, c = 0 で評価。x = 100 なので ans = 2。
- 次は、a = 0, b = 1, c = 1 で評価。150。
- 次は、a = 0, b = 1, c = 2 で評価。200。
- 次は、a = 0, b = 2, c = 0 で評価。200。
- 次は、a = 0, b = 2, c = 1 で評価。250。
- 次は、a = 0, b = 2, c = 2 で評価。300。
- 次は、a = 1, b = 0, c = 0 で評価。500。
- 次は、a = 1, b = 0, c = 1 で評価。550。
- 次は、a = 1, b = 0, c = 2 で評価。600。
- 次は、a = 1, b = 1, c = 0 で評価。600。
- 次は、a = 1, b = 1, c = 1 で評価。650。
- 次は、a = 1, b = 1, c = 2 で評価。700。
- 次は、a = 1, b = 2, c = 0 で評価。700。
- 次は、a = 1, b = 2, c = 1 で評価。750。
- 次は、a = 1, b = 2, c = 2 で評価。800。
- 次は、a = 2, b = 0, c = 0 で評価。1000。
- 次は、a = 2, b = 0, c = 1 で評価。1050。
- 次は、a = 2, b = 0, c = 2 で評価。1100。
- 次は、a = 2, b = 1, c = 0 で評価。1100。
- 次は、a = 2, b = 1, c = 1 で評価。1150。
- 次は、a = 2, b = 1, c = 2 で評価。1200。
- 次は、a = 2, b = 2, c = 0 で評価。1200。
- 次は、a = 2, b = 2, c = 1 で評価。1250。
- 次は、a = 2, b = 2, c = 2 で評価。1300。
という感じで、全27通りの組み合わせを評価することができる。