図解解説シリーズ
競技プログラミングを始めたばかりでAtCoderの解説やJOIの解説ではいまいちピンと来ない…という人向けに、図解を用いて解説を行います。
問題文
情報オリンピック日本委員会に掲載されている問題
AtCoderに掲載されている問題
入出力など実際に確認して自分の作成したプログラムを採点することができます。
図解解説
今年度の一次予選のB問題は、以下の3つのスキルを確認する問題になっています。
1.入力・出力を正しく利用できる
2.算術演算子を正しく利用できる
3.条件分岐(if)を正しく利用できる
(4.繰り返し処理を正しく利用できる)
問題文を整理するために、具体的な数字を用いて、図示して考えてみます。
入力例1を使って考えてみます。
28cm以上のアイスクリームタワーを作成します。ベースとなるアイスクリームは20cmです。希望の高さに足りませんので、追加のアイスクリーム(5cm)を重ねます。1つ重ねると25cm、2つ重ねると30cmとなり、28cmを超えます。したがって、250+100+100=450円が求める答えになります。このように、ベースとなるアイスクリームに追加のアイスクリームを加え続け、最終的に希望するアイスクリームタワーの高さ以上になったら終了するという戦略をとることができます。
一方、計算から求める方法もあります。28cm以上のアイスクリームタワーを作成します。ベースとなるアイスクリームは20cmですので、足りないのはあと8cm(28cm-20cm)です。追加のアイスクリームは5cmですので、不足分の8cmを使って8cm÷5cmを計算すると1.6となります。したがって、1個では足りず、2個追加すると28cmを超えることが計算からわかります。
条件分岐について、不安がある場合には上のスライドを参考にしてみてください。
解答例
戦略:ベースとなるアイスに追加のアイスを加え続ける
S = int(input())
A = int(input())
B = int(input())
#ベースだけでアイスクリームタワーが完成する場合は250を出力
if S<=A:
print(250)
else:
#ベースだけで完成しない場合について考える
#高さ(tall)の初期値をベースの高さ(A)、金額(amt)の初期値をベースの金額(250)に設定
tall = A
amt = 250
#最大100個追加できるので100回繰り返す
for i in range(100):
#高さ(tall)に追加のアイスクリームの高さ(B)を1回追加
#金額(amt)に追加のアイスクリームの金額100円を追加
tall = tall + B
amt = amt + 100
#高さ(tall)がアイスクリームタワーの高さ(S)以上になったら終了(break)し、金額(amt)を出力
if S<=tall:
break
print(amt)
戦略:計算から求める
S = int(input())
A = int(input())
B = int(input())
#ベースだけでアイスクリームタワーが完成する場合は250を出力
if S<=A:
print(250)
else:
#アイスクリームタワーの高さ(S)からベースの高さ(A)を引いた値(S-A)について考える
#追加のアイスクリームの高さ(B)で割り切れるとき追加で購入するアイスクリームの数は、(S-A)//Bとなる
#追加のアイスクリームの高さ(B)で割り切れないときは、(S-A)//B + 1 が追加で購入するアイスクリームの数となる
tuika = (S-A)//B
if (S-A)%B==0:
print(250+100*tuika)
else:
print(250+100*(tuika+1))
イラスト
スライド内で使用しているイラストはすべて「いらすとや」の素材を利用しています。