本サイトABC085C – Otoshidamaへは以下から
問題:Otoshidama
日本でよく使われる紙幣は、10000 円札、5000 円札、1000 円札です。以下、「お札」とはこれらのみを指します。
青橋くんが言うには、彼が祖父から受け取ったお年玉袋にはお札が N 枚入っていて、合計で Y 円だったそうですが、嘘かもしれません。このような状況がありうるか判定し、ありうる場合はお年玉袋の中身の候補を一つ見つけてください。なお、彼の祖父は十分裕福であり、お年玉袋は十分大きかったものとします。
- 1≤N≤2000
- 1000≤Y≤2×107
- N は整数である。
- Y は 1000 の倍数である。
入力
入力は以下の形式で標準入力から与えられる。
N Y
出力
N 枚のお札の合計金額が Y 円となることがありえない場合は、-1 -1 -1
と出力せよ。
N 枚のお札の合計金額が Y 円となることがありうる場合は、そのような N 枚のお札の組み合わせの一例を「10000 円札 x 枚、5000 円札 y 枚、1000 円札 z 枚」として、x、y、z を空白で区切って出力せよ。複数の可能性が考えられるときは、そのうちどれを出力してもよい。
入力例 1
9 45000
出力例 1
4 0 5
お年玉袋に 10000 円札 4 枚と 1000 円札 5 枚が入っていれば、合計枚数が 9 枚、合計金額が 45000 円になります。5000 円札 9 枚という可能性も考えられるため、0 9 0
も正しい出力です。
入力例 2
20 196000
出力例 2
-1 -1 -1
合計枚数が 20 枚の場合、すべてが 10000 円札であれば合計金額は 200000 円になり、そうでなければ 195000 円以下になるため、196000 円という合計金額はありえません。
入力例 3
1000 1234000
出力例 3
14 27 959
この他にも多くの候補があります。
入力例 4
2000 20000000
出力例 4
2000 0 0
解答例
N, Y = map(int, input().split())
for x in range(N+1):
for y in range(N+1-x):
z = N - x - y
if 10000*x + 5000*y + 1000*z == Y:
print(x, y, z)
exit()
print(-1, -1, -1)
解説
この問題は、与えられた条件(お札の枚数と合計金額)に基づいて、10000円札、5000円札、1000円札の組み合わせを見つけることを求めています。
- 入力の受け取り:
map(int, input().split())
を使用して、整数N
(お札の枚数)とY
(合計金額)を受け取ります。
- 組み合わせの探索:
- 3重のforループを使用して、10000円札、5000円札、1000円札のすべての可能な組み合わせを探索します。
- 各組み合わせに対して、合計金額が
Y
に等しいかどうかを確認します。 - 合計金額が
Y
に等しい組み合わせを見つけた場合、その組み合わせを出力して終了します。
- 結果の出力:
- 適切な組み合わせが見つかった場合、その組み合わせを出力します。
- そうでない場合、-1 -1 -1を出力します。
以下は、このアプローチを実装したPythonのコードです。
# 入力の受け取り
N, Y = map(int, input().split())
# 組み合わせの探索
for x in range(N+1):
for y in range(N+1-x):
z = N - x - y
if 10000*x + 5000*y + 1000*z == Y:
print(x, y, z)
exit()
# 適切な組み合わせが見つからなかった場合の出力
print(-1, -1, -1)
コメント