Kさんの住む市では,毎年秋に市民ロードレース大会が開かれる。Kさんは高校の情報部の仲間と運営ボランティアに参加し,コースの途中に置く給水所の計画づくりを手伝うことになった。給水所は,コースに沿った場所のうち,机とテントを置くことができ,飲み物を運ぶ車も止められる場所(以下,候補地点と呼ぶ。)の中から選ぶ。給水所を多く置くほど走者は安心して走れるが,給水所ごとにボランティアを数人ずつ配置する必要があり,飲み物や紙コップの準備も増える。大会の実行委員会からは,候補地点の一覧と,給水所の間の距離についての決まりが示された。そこでKさんは,走者が水を飲めない区間が長くなりすぎないようにしながら,給水所の数をできるだけ少なくする選び方を考え,その選び方をプログラムで確かめることにした。
大会の決まりでは,スタート地点から最初の給水所まで,隣り合う給水所の間,最後の給水所からゴールまでの距離(以下,間隔と呼ぶ。)は,どれも上限の5 km以下でなければならない。Kさんは,給水所を置く地点をスタート側から一つずつ,次の規則で選ぶことにした。
今年のコースは全長20 kmで,候補地点は8か所ある。表1は,各候補地点とゴールの,スタート地点からの距離である。なお,スタート地点から地点1まで,隣り合う候補地点の間,地点8からゴールまでの距離は,どれも上限以下である。
| 地点1 | 地点2 | 地点3 | 地点4 | 地点5 | 地点6 | 地点7 | 地点8 | ゴール | |
|---|---|---|---|---|---|---|---|---|---|
| 距離 | 2 | 4 | 6 | 9 | 10 | 13 | 16 | 17 | 20 |
スタート地点から5 km以下にある候補地点は地点1と地点2で,地点3は6 kmなので上限を超える。そのため,最初の給水所は地点2(4 km)に置く。同じように規則を当てはめると,2番目の給水所はスタート地点からアkmの地点に,3番目の給水所はスタート地点からイウkmの地点に置くことになる。さらに続けると4番目の給水所は17 kmの地点となり,ここからゴールまでは3 kmで上限以下なので,給水所は全部で4か所となる。
Kさんは,表1の距離を左から順に見ていくと,規則で選ぶ地点を次のように見つけられることに気づいた。
Kさんは,問1の規則に従って給水所を置く地点の距離を順に表示し,最後に給水所の数を表示するプログラムを作成した(図1)。
(01)行目の変数 jougen は間隔の上限を表す。配列 Chiten には,表1の候補地点の距離を地点の番号の順に格納し,最後の要素としてゴールの距離を格納する。配列の添字は1から始まり,地点の番号を表す。例えば,Chiten[4] の値は地点4の距離9であり,最後の要素 Chiten[9] の値はゴールの距離20である。(03)行目では,関数「要素数」を用いて,変数 n に配列 Chiten の要素の個数を代入する。
Kiroku が [12, 5, 30] のとき,要素数(Kiroku)は3となる。変数 mae は直前の給水所のスタート地点からの距離を表し,はじめはスタート地点から考えるので,(04)行目で0を代入する。変数 kazu はそれまでに置いた給水所の数を表す。(06)〜(10)行目の繰り返しでは,配列 Chiten の要素を添字の小さい順に一つずつ調べ,j 番目の地点が直前の給水所から上限を超える距離にあるかどうかを(07)行目で判定する。上限を超えるときは,問1のエの考え方に従って給水所を置く。給水所を置くときは,(08)行目でその給水所の距離を表示してから,(09)行目で mae を新しい給水所の距離に更新し,(10)行目で kazu を1増やす。
図1では,(07)行目の条件が成り立ったときにだけ(08)〜(10)行目が実行され,条件が成り立たない地点では何もせずに次の地点へ進む。図1のプログラムを実行すると,1行目に「4km地点に給水所」と表示され,4行目までに問1で選んだ4か所の給水所の距離が小さい順に表示された。最後の5行目には「給水所の数:4」と表示された。
Kさんは,図1のプログラムと実行結果を,実行委員のTさんに見せた。
Kさんは,この考え方で図2のプログラムを作成した。(01)〜(05)行目は図1と同じである。変数 j は次に調べる地点の番号を表し,(06)行目で1を代入する。(07)〜(12)行目の繰り返しでは,直前の給水所からゴールまでの距離が上限を超えている間,給水所を1か所ずつ置く。そのうち(08)・(09)行目の繰り返しでは,j 番目の地点が直前の給水所から上限以下の距離にある間,j を1ずつ増やして先へ進む。(10)行目では,この繰り返しが終わったときの j を使って,次の給水所の距離を mae に代入する。(11)行目のコには問2のコと同じものが入り,(12)行目では置いた給水所の距離を表示する。
図2のプログラムを実行すると,図1と同じ5行が表示された。
j を1に戻さず,続きから調べていますね。置いた給水所より手前の地点は,もう調べる必要がないからです。Kさんは,翌年の大会についても図2のプログラムで調べることにした。翌年はコースを30 kmに延ばし,候補地点は12か所に増える。また,開催を気温の低い時期に移すので,上限を7 kmに広げる予定である。図2の(01)行目と(02)行目を次のように変更してプログラムを実行すると,(09)行目の j = j + 1 はスセ回実行される。