2021年7月5日月曜日

競技プログラミング大会は、最高の知的ゲームだ!

さて、知り合いに競技プログラミングを勧めたのですが、「イマイチ、面白みが分からない 。」と言われたので、下記の問題を例に説明しました。尚、その知り合いですが、理系出身ですが、数学の専門家ではないです。勿論、高校数学レベルはかつて、完全に理解していると言う前提で話をしました。

提示したのは、At Coderと言う競技プログラミングのこの問題です。

→ At coder B問題

<抜粋>

====================

問題文

あなたは、500 円玉を A 枚、100 円玉を B 枚、50 円玉を C 枚持っています。 これらの硬貨の中から何枚かを選び、合計金額をちょうど X 円にする方法は何通りありますか。

同じ種類の硬貨どうしは区別できません。2 通りの硬貨の選び方は、ある種類の硬貨についてその硬貨を選ぶ枚数が異なるとき区別されます。

制約

  • 0A,B,C50
  • A+B+C1
  • 50X20,000
  • A,B,C は整数である
  • X は 50 の倍数である
=================

高校数学で言う、Combination問題ですね。
Combination問題は、得意な人は恐らくおらず、貴公子も学生時代は大嫌いでした。
X円が1,000円とからなら、大したことないですが、X円が12,000円だったらどうするか?
非常にメンドクサイ話です。

貴公子が書いたコードは下記です。

<test2.py>
==============
A=int(input())
B=int(input())
C=int(input())
X=int(input())

cnt=0

for i in range(A+1):
for j in range(B+1):
for k in range(C+1):
if X==500*i+100*j+50*k:
cnt=cnt+1
print(cnt)
================


AとBとCを仮に50枚として、このプログラムをPC上で走らせて、Enterを押すと、瞬間で、266通りと回答します。
*********************************
C:\Users\KIKOUSHI\Desktop\bulk1008>python test2.py
50
50
50
12000
*********************************

数学の素養のある人なら、このたった10行程度のコードで回答が得られるのに驚くと思いますが、この問題と回答をその知り合いに見せたら、唸りました!

Pythonと言うが、コードが凄すぎる!


<今夜の名曲>
さて、今夜の名曲です。
20年以上、探していた曲です。
昔は、たまに、街中で流れていたが、歌手も曲名も分からなかったですが、先程、Youtubeのランダム再生で流れてきました。
超名曲です。

1971年、Carpenters のSuperstar !

0 件のコメント:

コメントを投稿