このクイズのヒント
-
ヒント知らないよ
このクイズの参加者(10人)
広告

広告
広告
クイズ大陸関連書籍
![]() ![]() |
![]() |
![]() |
![]()
難易度:★★★
![]() ![]() 買い物をした際、支払いで日本円の硬貨5枚を出して、お釣りとして硬貨6枚を受取りました。
お互いの硬貨のやり取りは、その金額ちょうどを出す為に必要な最小枚数の現行貨幣で行われています。 また、支払いに使ったのと同じ硬貨がお釣りで返ってくるような出し方は行っていません。 (例) 40円の支払いに540円を出す → 500円玉がそのまま返ってくるので不適 この時、 1) 買い物の金額として有り得る最大値はいくらでしょうか? 2) 買い物の金額として有り得る最小値はいくらでしょうか? 想定難易度は1)が☆、2)が☆☆☆です。 ちょっと答え合わせの解答欄を、2)の正解で設定しています。 全角・半角どちらでもOKですが、単位なしでお願いします。 (10/19追記)ご指摘を受け、問題文の表記を一部修正しました。 また、出題者の体調不良により返信が遅れてしまいました。すみません。
|
@2481円 500円5枚で支払い、19円をもらう。
A9円 ・支払った金額>受け取る金額となり、かつ2つの金額の差ができるだけ小さくなるような組み合わせを探す。 最小となるのは支払いが104円、お釣りが95円 商品の値段は9円となる。 ![]() ![]() 設問は支払った金額じゃなくて商品の値段ではないでしょうか。
![]()
Prime
2問とも正解です!
ご指摘に感謝いたします。 問題文を一部修正しました。 せっかくご指摘頂いたにも関わらず、修正が遅れてしまいました。 ![]()
Prime
1)正解です!
むしろ、そちらの解釈が正解です。 現実的には不自然な支払い方ですが。 ![]()
Prime
2)も正解です!
支払い金額も合っています。 その1通りしか有りません。 ![]() ![]() 「支払った金額」
A:100円のものを買うのに、1000円札で支払った(精算するために出した金額) B:1000円札を使って、100円の支払いをした(実際に使った金額) Aなら1000円、Bなら100円、日本語難しい ![]() この問題はどっちを答えれば(まだどっちでも分かってないけど ![]() ![]()
Prime
これは完全に出題者の表現ミスです、申し訳ございません。
正解で設定している金額は後者、Bの解釈です。 問題文を修正させて頂きました。 (1)商品代金の最大値:2481円。2500円払って19円のお釣り。
(2)商品代金の最小値:9円。104円払って95円のお釣り。 (1)については、「現行貨幣」の定義によるのですが、49万9981円、と答えてもおかしくはないですね。10万円金貨5枚で払う。 (2)の最小値2位、は多分44円です。 ![]() ![]() Prime さん、はじめまして、ですよね。楽しい問題をありがとうございます。
私はほぼ確実にこの種の支払い方をして、小銭入れの中を常に最小枚数にするよう努めますので、特に楽しかったです ![]() 答えあわせで確認したところ、答えるべきはどうやら yoshida さんの分類のB、商品の代金のようですね ![]() ところで、題意を満たす代金の最小値を調べるのもわりと大変でしたが、「2番目・3番目・4番目に小さい」値を探すのはすごく難しいです。とりあえず候補は見つけてあるのですが、全然自信なし。プログラミングしてみようかな。 ![]()
Prime
1)、2)共に正解です!
はじめまして、でした。よろしくお願いします。 問題文ですが、色々と上手い表現が出来ていませんでした。 日本語を学び直す必要が有りそうです…。 また、2)で2番目に小さい金額を見つけるのが難しいことに、コメントを見て気付かされました。 こちらでも検証してみます。 ![]()
Prime
正解です!
ご安心下さい、計算式も合っています。 ![]()
Prime
2)も正解です!
支払いの内訳も、同じ回答にたどり着いたのでしょう。 ![]()
Prime
2問とも正解です!
いかにもクイズ的な解答になります。 実際の支払いでは、店員に変な目で見られそうですが。 >その金額ちょうどを出す為に必要な最小枚数
「ちょうど」ならお釣はないし、 302円に必要な最低枚数は500円玉1枚。でも500円+2円で払いたい。 という、理解不足のオッサン疑問。 ![]() ![]() ICOCAでお願いします。
![]()
Prime
例えば302円を出す場合は、最少の「100円玉3枚+1円玉2枚」で支払うこととして、
「1円玉302枚」や「50円玉6枚+1円玉2枚」のように、 わざわざ硬貨の枚数が多くなる出し方をしない、という意味です。 出題者の表現力不足です、すみません。 2〜5番目に小さい値
140-81=59 203-108=95 230-171=59 302-207=95 ![]() ![]() 見落としがあるかもしれませんが、いかがでしょうか?
説明不足で申し訳ありません。 No.5の「2〜5番目に小さい代金」について私なりに考えてみました。 ![]()
Prime
頂いた解答は「支払いの為に出した金額」の検証でしょうか?
予想外のアプローチでした、正解を用意していなかったので調べてみます。 出題の意図とは違うかもしれませんが、コンピュータプログラムで網羅探索してみました。
最小限の数のコインで支払い、最小限の数のコインでお釣りを受け取る、という条件だと、小さい方と大きい方は下記のようになります。 price:価格 p_amount:支払額 change:お釣り pcp:支払の硬貨の組合せ ccp:お釣りの硬貨の組合せ {'price': 9, 'p_amount': 104, 'change': 95, 'pcp': [1, 1, 1, 1, 100], 'ccp': [5, 10, 10, 10, 10, 50]}, {'price': 49, 'p_amount': 504, 'change': 455, 'pcp': [1, 1, 1, 1, 500], 'ccp': [5, 50, 100, 100, 100, 100]}, {'price': 44, 'p_amount': 504, 'change': 460, 'pcp': [1, 1, 1, 1, 500], 'ccp': [10, 50, 100, 100, 100, 100]}, {'price': 48, 'p_amount': 508, 'change': 460, 'pcp': [1, 1, 1, 5, 500], 'ccp': [10, 50, 100, 100, 100, 100]}, {'price': 58, 'p_amount': 513, 'change': 455, 'pcp': [1, 1, 1, 10, 500], 'ccp': [5, 50, 100, 100, 100, 100]}] {'price': 2481, 'p_amount': 2500, 'change': 19, 'pcp': [500, 500, 500, 500, 500], 'ccp': [1, 1, 1, 1, 5, 10]}, {'price': 2476, 'p_amount': 2500, 'change': 24, 'pcp': [500, 500, 500, 500, 500], 'ccp': [1, 1, 1, 1, 10, 10]}, {'price': 2472, 'p_amount': 2500, 'change': 28, 'pcp': [500, 500, 500, 500, 500], 'ccp': [1, 1, 1, 5, 10, 10]}, {'price': 2467, 'p_amount': 2500, 'change': 33, 'pcp': [500, 500, 500, 500, 500], 'ccp': [1, 1, 1, 10, 10, 10]}, {'price': 2463, 'p_amount': 2500, 'change': 37, 'pcp': [500, 500, 500, 500, 500], 'ccp': [1, 1, 5, 10, 10, 10]} 一方、私はこちらの方が問題としては面白いと思うのですが、 財布の中には50円玉が2枚あったり、必ずしも最小限の枚数のコインだけがあるとは限らないので、支払の方は、多すぎ(50円玉を出して、50円玉がお釣りで返ってくる等)なければ、最小限のコインで支払わなくても良い。お釣りは最小限の枚数のコインで返ってくる。そういう条件で計算すると、価格の下位と上位は、以下のようになります。 ※下位は、「5円玉余っていて、この機会に整理してやろう」というような意図の支払ですね。買い物より財布の整理が主目的になっている感があります。ちょっと屁理屈っぽいですが。 {'price': 1, 'p_amount': 25, 'change': 24, 'pcp': [5, 5, 5, 5, 5], 'ccp': [1, 1, 1, 1, 10, 10]}, {'price': 1, 'p_amount': 115, 'change': 114, 'pcp': [5, 5, 5, 50, 50], 'ccp': [1, 1, 1, 1, 10, 100]}, {'price': 1, 'p_amount': 205, 'change': 204, 'pcp': [5, 50, 50, 50, 50], 'ccp': [1, 1, 1, 1, 100, 100]}, {'price': 6, 'p_amount': 210, 'change': 204, 'pcp': [10, 50, 50, 50, 50], 'ccp': [1, 1, 1, 1, 100, 100]}, {'price': 2, 'p_amount': 210, 'change': 208, 'pcp': [10, 50, 50, 50, 50], 'ccp': [1, 1, 1, 5, 100, 100]} {'price': 2481, 'p_amount': 2500, 'change': 19, 'pcp': [500, 500, 500, 500, 500], 'ccp': [1, 1, 1, 1, 5, 10]}, {'price': 2476, 'p_amount': 2500, 'change': 24, 'pcp': [500, 500, 500, 500, 500], 'ccp': [1, 1, 1, 1, 10, 10]}, {'price': 2472, 'p_amount': 2500, 'change': 28, 'pcp': [500, 500, 500, 500, 500], 'ccp': [1, 1, 1, 5, 10, 10]}, {'price': 2467, 'p_amount': 2500, 'change': 33, 'pcp': [500, 500, 500, 500, 500], 'ccp': [1, 1, 1, 10, 10, 10]}, {'price': 2463, 'p_amount': 2500, 'change': 37, 'pcp': [500, 500, 500, 500, 500], 'ccp': [1, 1, 5, 10, 10, 10]} プログラムは、コインの組合せを順に生成するような組み方をしているので、最小限の枚数以外の支払い方にも対応して探索できます。 ![]() ![]() 個人的に、コンピュータプログラムで解いてみたかったので・・・
![]() ![]()
Prime
これは凄い検証をありがとうございました!
1)、2)ともに正解しています。 別提案の「買い物する側は、最少枚数の硬貨で支払わなくても良い」問題は、 ルールを守りながら「買い物のついでに逆両替」の感が有って、 これはこれで面白いと思います! ![]()
Prime
更に小さい金額のケースが有ります。
是非お考え下さい。 代金 渡す お釣り
9 104 95 44 504 460 48 508 460 49 504 455 58 513 455 67 522 455 76 531 455 81 140 59 84 504 420 84 535 451 85 540 455 ![]() ![]() プログラムを書いてみました。予想外にシンプルな構成で書けましたが、ロジックはこれでいいのかな(^^
取り急ぎ代金の小さいベスト10を囁きに。 終了後、Yssさんと「どういう構成のプログラムなのか」を交換したいです。 ![]()
Prime
またしてもプログラム検証者が!
ありがとうございました。 公開はもう少しお待ち下さい。 出題者の人力検証では、2番目の解まで突き止めるのが限界でした。 ・硬貨5枚の効率的な組み合わせを網羅 全143通り
・硬貨6枚の効率的な組み合わせを網羅 全213通り(ここで6枚組のほうを金額順にソートして置くと後の処理が早い) 5枚組と6枚組をそれぞれ総当りでペア対戦させ題意を満たすペアだけを残す。 生き残りの条件: 必要条件1・金額が 5枚組>6枚組 必要条件2・5枚組と6枚組で同じ硬貨を使っていない 上記を満たして生き残った5枚組・6枚組のペアは全542通り。 各ペアの差(=商品代金)は重複があって全458通り(9円から2481円まで) ![]() ![]() シンプルなプログラム構成を書き残しておきます。
![]() ![]()
Prime
分かり易い理論もありがとうございます!
総当りと生き残りの条件が、問題の趣旨を完璧に捉えています。 ![]()
Prime
1)正解です!
答えの数字が正しいならば、支払いの内訳も事実上合っています。 ご安心下さい。 9
百円玉×1と一円玉×4で支払い、お釣りが五十円玉×1と十円玉×4と五円玉×1 っていうのはダメでしょうね。 ![]() ![]() 2)です。
たぶん却下ですよね。(頭で考えました)次の候補はかなり大きくなります。 ![]()
Prime
正解です!
むしろ、その解答が唯一の最小解です。 プログラムはちょっと長いので・・・構成のみ。
for kingaku=1 to ...などとして、金額でループを作ってしまうと、 50円玉が2枚、などの硬貨に重複のある支払いが検証できなくなるので、 金額でループさせるのではなく、 全ての硬貨の組合せを生成させることにしました。そこで、 まず、イテレータ※を作りました。※呼び出すたびに、データを順に提示してくれるルーチン 日本の硬貨は6種類あるので、6進法的に繰り上がりながら硬貨の組合せを生成します。 但し、1,1,1→1,1,5→...→1,1,500→1,5,1、とやってしまうと、同じ組合せが現れてしまうので、 繰り上がりの時は、上の桁(?)と同じ硬貨で埋めます。1,5と来たら、最後の桁は5ですし、 1,10と来たら、最後の桁は10です。 こうして、硬貨のあらゆる組合せを漏れなく、重複なく生成するイテレータを作りました。 イテレータを初期化する段階で、硬貨何枚のパターンを生成するかを決められるようにしました。 一方、ある金額を与えたときに、500円、100円、と金額の高い方から引けるだけ引いていき、最小の枚数で支払う硬貨の組合せを求めるルーチンを作りました。 あとは、支払い側で5枚の硬貨、お釣りで6枚の硬貨のパターンを、 先ほどのイテレータを二重のループにして、網羅的に生成して、 チェック項目として、 (1)支払い金額>お釣り であることの確認。 (2)お釣りが最小枚数であることの確認。 (3)お釣りが最小枚数で返って来るとして、支払いに「お釣りに含まれている硬貨」が 含まれていないことの確認(50円玉を出して、お釣りに50円玉が戻ってくる、 というような間抜けなことがない、という確認) その上で、条件を満たすもののうち、支払い金額ーお釣り=商品の値段が、 高い方から5個、低い方から5個を覚えておいて(←プログラムが)出力しました。 上の(1)から(3)の条件に、(4)支払いの方も最小枚数で払っているかどうか、を付け加えると、本問の本解になりますし、つけなければ、支払いの方は渡した硬貨さえ戻ってこなければ重複した硬貨を使っても良い(50円玉2枚とか)、という、少し別の支払い方の検証になります。 幅広く検証したかったので、処理に無駄がありますが・・・最近のPCは早いので・・・まあいいかな、と。 ![]() ![]() たっくん4さんのリクエストにお応えして・・・
![]()
Prime
ルーチンのご提供までありがとうございます!
正直、出題者は初見で理解し切れませんでした。 時間を掛けて、何とか付いていこうと思います。 |