タムログ

プログラミングについての情報発信をしていきます!

AtCoder Beginner Contest 160 B を Python で

AtCoder Beginner Contest 160 B 問題を Python で解説していきたいと思います。
この問題は,問題文をよく読んでなくて WA 祭りになった苦い思い出がある問題です。😅
初心者でもわかりやすいように書いてみましたので,ぜひ見ていってください!
それではまずは問題文から。
https://atcoder.jp/contests/abc160/tasks/abc160_b


B – Golden Coins


実行時間制限: 2 sec / メモリ制限: 1024 MB

配点 : 200 点

問題文

高橋君は金色の硬貨が好きです。自分が持っている 500 円硬貨 1 枚につき 10005 円硬貨 1 枚につき 5 の 嬉しさ を得ます。

高橋君は X 円を持っています。これを高橋君の嬉しさが最大になるように両替したとき、高橋君の嬉しさはいくらになりますか?

(なお、利用できる硬貨は 500 円玉、100 円玉、50 円玉、10 円玉、5 円玉、1 円玉の 6 種類とします。)

制約

  • 0≤X≤109
  • X は整数

入力

入力は以下の形式で標準入力から与えられる。

X

出力

嬉しさの最大値を出力せよ。


解説

X 円 を上手く両替して,嬉しさの値を最大にするといった問題です。
500円玉一枚につき嬉しさが1000,5円玉一枚につき嬉しさが5ということなので,できるだけ500円を多く,次に5円玉が多くなるように両替したいということです。
500円玉の数を gold,5円玉の数を bronze としておきます。

まずは X 円 をできるだけ500円に両替したいと考えて,X を500で割った商を500円玉の数とします。これが500円玉の数の最大値になりますね。つまり
gold = X // 500
となります。

次に残ったお金をできるだけ5円玉に両替することを考えます。まずは X を500円玉に両替した後の値にするため,
X -= 500 × gold
とします。あとはこの X を先ほどと同様,できるだけ5円玉に両替することを考えて,X を5で割った商を5円玉の数とします。これが5円玉の数の最大値になりますね。つまり
bronze = X // 5
とすればよいです。

以上で gold と bronze が出ましたので,あとは500円玉一枚につき嬉しさが1000,5円玉一枚につき嬉しさが5ということから,嬉しさを出して出力してやればいいです。
以下が回答例です。

解答例

x = int(input())

gold = x // 500
x -= gold * 500

bronze = x // 5

print(gold*1000 + bronze*5)

いかがだったでしょうか。
最初に WA を出してしまった時ってなぜ間違っているのか分からなくてテンパってしまいますよね。(笑)
個人的には冷静になることの大事さが分かった問題でした。😅
それでは!