ニュートン算 はじめに 一時期ほどではないにしろ、首都圏における中学受験は相変わらず炊き門のようです。時に、そこで出題される 問題について、良問か難関奇問か議論の対象となることがあります。算数に限定して言えば、対象は、小学生で すから方程式は使えません。 方程式を使わずに、頭をひねって問題を解くことが面白いとも言えますが、実際に受験生をおもちの方にしてみ れば「面白い」などと悠長なことは言ってられませんよね。 こうした算数の文章問題の中には、定番的な問題として「つるかめ算」「植木算」「流水算」などなど、○○算 と名の付くものが結構あります。 「流水算」とは、「カヌーで川の 24km 上流に向かうと 6 時間かかりまし。途中で方向転換し下流に向かうと出 発地点まで 3 時間かかりました。この川の流れの速さは時速何 km でしょう?」 といった問題です。 小学生にとっては「速度」という考え方自体、決して易しいものではありませんし、実際に体験したことがな いことは想像しにくいものです。まず、普通の小学生はカヌーなんか漕いだことありませんからね。「動く歩道 ってあるでしょ?その流れに発って走ればすごく速く目的地に着くけど、流れに逆走するとすごく時間がかかる じゃない?そんな感じを想像してね。あっ、でも架際にやっちゃだめだよ」って感じで説明しないと、状況をつ かむのはなかなか難しいでしょう。 もっとも、今回扱うのは「流水算」ではなく、「ニュートン算と呼ばれるものです。「速度」が出てくる点は共 通ですが、ニュートン算では 2 つの異なる速度を同時に扱わなければいけません。問題の意図を理解して順序だ てて考えないと、小学生にはかなり難しい問題です。みなさんは、まずは自力で解いてみてください。 問題にチャレンジ! それでは、今回の問題です。 あるところに、不思議な牧草地があります。この牧草地に牛を 6 頭放しました。すると牧草は 7 日間で食べ尽 くされました。次に草が生えそろうまで一定期間置いて、牛を 10 頭放したところ、今度は 3 日間で牧草はなく なってしまいました。 では、仮に同じ条件で牛を 9 頭放したとしたら、牧草は何日で食べ尽くされてしまうでしょうか? ただし、草は一定の割合で生えてくるものとし、牛も好き嫌いを言わず一定の割合で草を食べるものとします。 いかがでしょうか。この問題はニュートン算では代表的な問題ですが、わかりにくさという点でも代表的と言 えるでしょう。 この問題を解くには、ある種の妥協が必要です。つまり、牛はお行儀よく牧草地の端から一定のリズムで牧草 を食べ、牧草もこれまた律儀に食べられたところから一定の割合で生えてくる、という前提が必要なのです。 牛が 1 日に食べる章をひと山として考える この問題を解く最大のポイントは、牛が 1 日に食べる牧草の量を「ひと山」と仮定することです。つまり、牛 が 3 頭いれば、1 日に牛が食べる牧草の量は「3山」、3 頭の牛が 4 日間草を食べれば「12 山」ということにな ります。 まずは牛の数ではなく、すべての牛が食べた牧草の量に注目して、先ほどの問題を整理してみましょう。 条件 1 : 6 頭の牛が 7 日間で食べた牧草の量 6 (山)× 7 (日)= 42 (山) --- 式 1 条件 2 : 10 頭の牛が 3 日間で食べた牧草の量 10 (山)× 3 (日)= 30 (山) --- 式 2 1 この結果から、牛が牧草を食べ尽くすのに、それぞれ 42 山、30 山を食べたということがわかります。 次に、食べ冬くされた牧草の内訳について考えてみましょう。 食べ冬くされた牧草は次の式で表わすことができます。 食べ尽くされた牧草の量=最初にあった牧草量+ 1 日に生える牧草量×日数 ---- 式 3 先に求めた式 1・2 を、式 3 に当てはめると次のようになります。 42 山=最初にあった牧草量+ 1 日に生える牧草量 X7 日間 30 山=最初にあった牧草量+ 1 日に生える牧草量 X3 日間 牧草地に最初から生えている牧草の量は同じですから、この 2 つの式の差分をとることで、4 日間で生える牧 草量が 12 山であるとわかります。つまり、1 日に生える牧草量は「3山」ということですね。 これにより最初にあった牧草量は、前述した 2 つ式のいずれかに 1 日に生える牧草量「3 山」を当てはめるこ とで、「21 山」となることもわかります。 では、ここまで求めた内容を整理しておきましょう 図 1:牧草量に注目して問題を整理する (図 1)。 牛 9 頭の場合にあてはめてみましょう これでずいぶんと状況がはっきりしてきましたね。 では問題の牛の頭数、9 頭の場合についてあらためて 考えてみましょう。 1 日に 1 頭の牛が食べる牧草の量をひと山とするので すから、9 頭いれば 1 日に食べる牧草の量は 9 山です。 牧草は 1 日に 3 山しか生えないことから、1 日あたり 6 山足りないことになります。 最初にある牧草量は 21 山です。つまり 21÷6 から、 3 日と半日で牧草は食べ尽くされてしまうことにな ります。 図 1 のようなところまで考え方をもってゆければ、2 つの変化する量、すなわち牧草の生える量と牛の食べる 量の差分で、あらかじめストックされている量(この場合は最初から牧草地に生えている牧草量)を除算すれば よいことがわかります。 とはいえ、これを小学生に理解させるのはなかなか大変です。 変化する 2 つの量が、どうも実体験として実感できないからです。そこで、ニュートン算のバリエーションとし て、スーパーでのレジ清算時のシチュエーションを問題にしてみました。また、視覚的に体験できるように、VBA のツールもあわせて紹介してゆくことにします。 では、問題をご覧ください。 今回の問題その2 ここは郊外にあるショツピンクセンターです。食品部門の責任者である新任の A 君は、はりきって店内を巡回し ていました.ふとレジヘ目を向けると、ずいぶんと長い列ができています.数えると 24 人ものお客様が並んで いました。今朝はレジを 1 台しか開けていなかったのです。あわてた A 君看はすぐにレジをひとつ開け、2 箇所 にしました。 すると、人数は減るどころか、6 分後には 36 人ものお客様が並んでしまったのです.並んでいるお客様の顔には 青筋が…。パニックになった A 君はレジをさらにひとつ開け、3 箇所にしました。すると、12 分後にやっと行列 はなくなりました。 では、もし A 君が最初に気ついた時点でレジを 4 箇所にしていれば、行列は何分後になくなっていたでしょう か?ただし、この日はどういうわけか、お害さんが次から次へと一定の割合でやってきました。 2 サンプルでシミュレーション 問題その 2 では、レジの分あたりに処理できる人数と、一定の割合でやってくるお客様の人数という 2 つの変 化する量がポイントとなります。先ほどの牛の放牧例でも解説しましたが、ある一定の時間の中で、2 つの変化 量がどれだけで、どのくらいの差分がでてくるかをはっきりさせることが解法への近道です。 今回用意したサンプルコードとその解説は記事末にまとめましたのでそちらを参考にしてください。ここでは サンプルの使い方を説明し、ちょっとした簡単な実験をしてみましょう。 初期条件をセットする サンプル「NEWTON.xls 」を起動した ら、最初にワークシートに初期条件を設定 します(図 2)。最初に設定する条件はと てもシンプルです。レジは 1 台で、処理能 力は分あたりひとりとし、来客する割合も 分あたりひとりとしましょう。そして現在 待っているお客様は 5 人で、制限時間 10 分で行列がどうなるかシミュレートして みます。 今回のサンプルは、ショートカットキー で実行できるようにしてあります。条件を 設定したらキーボードから[ctrl]キーと [Shift]キーを押しながら[ N]キーを押 してください。奥様方がちゃんと列を作っ て整列し、確認メッセージが表示されます (図 3)。 図 2:ワークシートに初期条件を設定する 図 3:初期設庇を行ない、[Ctrl]+[Shift]+[N]キーの操作 をした直後の画面 ここで、セル B6 に表示される「客の増 減」に注目してください。今回の初期条件 では分あたりに処理できる人数と来客数 が同じなので、時間あたりの客の増減はあ りません。 実験開始 それではシミュレート開始の確認メッ セージに表示されている[OK]ボタンを クリックして、シミュレートしてみましょ う。 図 4:シミュレート開始。途中経過と終了時の様子 次々とお寄様がやってきますが(どういう わけか、後からやってくる奥様は気が短い ようで怒っています)、制限時間になって シミュレートが終了しても、列に並んでい る人数はシミュレート前と変わりません (図 4)。 3 初期設定を変えてみる それでは初期設定の「レジ能力」を「2」に変更し てシミュレートしてみましょう。実行した結果を図 5 に示します。シミュレートの過程を見ていただくとわ かるように、レジの処理能力と来客数の関係から、分 あたりひとりずつお寄様が減ることになります。行列 がなくなるまでの時間は、最初の待ち人数が 5 人なら 5 分、10 人なら 10 分の時間を要することになります。 解法へ導くには、まずはこうした基本的な量の変化 をしっかり理解することが大切です。 図 5:初期設定を変えてシミュレーション 1 回目 ひとつ目の条件でシュミレーション では問題その 2 を、このツールを利用して解いてみま しょう。 レジ 2 台で 6 分間に 12 人増えてしまったのですか ら、分あたり 2 人ずつお寄様が増えていることになり ます。仮にレジ 1 台の処理能力を分あたりひとりと仮 定すると、分あたりの来客数は 4 人となります。まず この条件を設定し、6 分後の結果を見てみましょう。 図 6 のように初期設定を行ない、実行してみてくださ い。結果、レジに並んでいる人数は 36 人になりましたね(図 7)。ここまではうまくいったようです。 図 6:問題その 2 シミュレー ト 1 回目の初期設定 図 7:問題その 21 回目のシミュレート結果 4 2回目 2つ目のの条件でシュミレーション 図 8:問題その 2 シミュレート 2 それでは、2 つ目の条件でシミュレートしてみましょう。図 8 のように 回目の初期投定 初期設定を行ない、ショートカットキーから実行すると、シミュレート 開始の確認メッセージが表示されます。この段階でワークシートを見る と「答の増減」が「1」になっていることに気づくでしょう(図 9)。 2 つ日の条件では 12 分間で 36 人減ったのですから、この値は「-3」 とならなければいけません。つまり最初の条件で設定したレジの処理能 力と来客数の組み合わせが間違っていたことになります。 あとは組み合わせを試しながら両方の条件にあうものを探してゆけば よいのです。こうしてすべての条件を満たす組み合わせでシミュレート した結果が図 10 です。レジの処理人数が持「5」、来客数が「12」のとき、処理時間「12」で残客数が「0」に なりました。 図 9:「客の増減」が「1」になっている 図 10:レジの処理能力と来客数の組み合 わせが一致した結果 5 3回目 最後のシュミレーション これまでのシミュレートによって、レジの処 理人数と来客数の正しい組み合わせがわかり ました。この結果を踏まえて、間題その 2 の 最終的な答えを求めてみましょう。問題は「お 客様が 24 人並んでいる段階で、レジを 4 つ にしていたら何分後に行列はなくなっていた でしょう?」ですね。実行結果は図 11 のよう になります。答えは「3分後」ですね。 図 11:最後の条件を入力して問題の処理時間を求める サンプルを作成する それでは、今回のサンプルの作成方法について説明します。 まず、ワークシートを 1 枚用意し、図 12 のような設定をし ておきます。ちなみにセル B9∼B13 には、Excel の入力規 則機能を利用して入力データに制限を付けています(入力規 則についてはヘルプなどをご参照ください)。 図 12:ワークシートをデザインする 実際に処理を行なっているのは、標準モジュールに記述し たコード「 s_Register」だけです(リスト 1)。このコードに ついて、いくつか注意点をあげておきましょう。 画像の扱い 今回のサンプルでは画像の追加と削除を繰り返し行ない ます。画像は Shapes コレクションの一員として扱うので、 同じワークシート上にテキストボックスやコマンドボタン などがあると、これらも Shapes コレクションに含まれてし まいます。今回はコードが煩雑になるのを避けるため、ワー クシート上にお客様の画像以外のオブジェクト(他のピクチ ャやボタン類)は配置せず、プログラムもショートカットキ ーで実行するようにしました。 実際に画像をワークシートの所定の位置に挿入する処理は、②−1 と②−2 の部分です。画像を新規に追加す るときは、AddPicture メソッドを使います。基本構文は表 1 をご覧ください。 今回は AddPicture メソッドの LinkToFile 引数に True を指定して、元の画像ファイルからリンクする形でワ ークシートに挿入しています。このためコードの最初で行なっている挿入した画像の消去処理では、Shape オブ ジェクトの種類を判別するために「 msoLinkedPicture」を指定しています(①)。LinkToFile 引数に False を指 定した場合には、この部分が「msoPicture」となりますので注意してください。また、 Left と Top の引数には 画像の位置をポイント単位で指定しますが、今回は特定のセル位置に画像を表示させるため、画像と位置をあわ せるセルの Left およぴ Top プロパティを利用して位置を取得しています。 6 時間差表示 サンプルでは、来答とレジで処理するタイミングに若干のタイムラグを設けています。これはシミュレーショ ンの動きを見やすくするためです。前回のサンプルでは Win32API の SleeP 関数を利用しましたが、1 秒以上の 制御であれば wait メソッドを利用できます。③のコードで利用している Wait メソッドは、実行中のプロシージ ャを指定の時刻まで停止する命令で、サンプルでは 1 秒間処理を停止しています。 表 1:AddPicture メソッドの基本構文 Excel では新規のワークシートにオートシェイブの四角形を描画すると、その四角形には「四角形 1」 という名前が自動で設定されます。この名前はオートシェイブを選択したときに画面左上の名前ボック スに表示されるものです。次に楕円を描画すると「楕円 2」という名前が自動設定されます。このよう に、連番が名前の末尾に次々とふられてゆくのです。たとえば、この状態でワークシート上のオートシ ェイブをすべて削除し、続けてオートシェイブを描画した場合、連番情報は引き継がれ「××3」とい う名前が自動設定されます。 この連番情報は、ワークシート上のオートシェイブを削除してファイルを保存終了後、再びファイル を開くことでクリアできますが、ひとつでもオートシェイブが残っていると達番情報はクリアされない ようです。 このため、今回のサンプルを「常に画像を残した状態で保存し、ファイルを開いて実行」というよう に相当な回数繰り返し使用すると、連番の限界値によっては(どの程度まで許容範囲があるかはわかり ませんが)サンプルが正常に動作しなくなる可能性があります。 ショートカットキーの登録 作成したプロシージャ「s_Register」をショートカットキーから実行できるようにするには、Excel のメニュ ーから[ツールト[マクロ]-[マクロ]を選択し、「マクロの登録」ダイアログボックスを開きます。ここから[オ プション]ボタンを選択してショートカットキーの登録をします(図 13)。 誌面で紹介したサンプルと、もうひとつおまけのサンプルを収録しました。おまけのほうは制限時間をある数値 にすると、ちょっと面白いことが起こります。興味のある方は、いろいろ試してみてください。 7 おわりに 今回のサンプルは、処理できる最小単位が「分」になっているため、正解が何分何秒となるような問題には対 応できません。実際に出題される場合には、必ずしも割り切れる数字が答えになるとは限らないので、解法のテ クニックは同じであっても、条件の数値が分数や小数になっているとより難しく感じてしまうでしょう。そうい えば数年前に東京の超難関中学で実際に出題された問題に、答えが実に中途半端な値になる問題がありました。 どんな答えだったかは正確に覚えていませんが「136 23/37 」といった具合に、解答を導き出しても不安になる ような値でした。もっとも、そうして不安にさせて理論や計算の確かさを問うというのが出題者の狙いだったの でしょう。 難しいなと思われる算数の問題を解くにはまず「問題の本質を理解する」、そして「内容を簡略化し、図や絵 にして整理する」。この 2 点が重要な鍵と言えそうです。 図 13:マクロオプションでショートカットキーを登鎖 する リスト1:レジの処理人数と来客数をシュミレーションするコード Sub s_Register() Dim RegS As Integer, CusS As Integer, CusC As Integer Dim RegC As Integer, SC As Integer, SR As Integer Dim i As Integer, j As Integer, LimTime As Integer Dim AddR As Integer, AddC As Integer Dim CurCusC As Integer Dim myPic As Shape Dim myCell As Range '初期値セット SR = 2 SC = 6 RegS = Range("B9").Value CusS = Range("B10").Value CusC = Range("B11").Value '客の整列開始行 '客の整列開始列 'レジの処理能力 (人/分) (人/分) '来客数 '最初にいた客数 (人) 8 RegC = Range("B12") .Value 'レジの台数 LimTime = Range("B13").Value '制限時間 (分) Range("B2").Value = 0 '処理時間クリア Range("B4").Value = CusC '残客数セット Range("B6").Value = CusS - RegS * RegC '増減値セット Cells(SR, SC - 2).Value = "" 'レジAの処理人数クリア Cells(SR + 2, SC - 2).Value = "" 'レジBの処理人数クリア Cells(SR + 4, SC - 2).Value = "" 'レジCの処理人数クリア Cells(SR + 6, SC - 2).Value = "" 'レジDの処理人数クリア '列幅変更 Range(Cells(SR, SC), Cells(SR, ActiveSheet.Columns.Count)) _ .ColumnWidth = 4 'ピクチャクリア For Each myPic In ActiveSheet.Shapes ① If myPic.Type = msoLinkedPicture Then myPic.Delete End If Next '初期に並んでいる客を表示 CurCusC = 0 Do While CurCusC < CusC For i = 0 To RegC - 1 I f C u r C u s C < CusC Then Set myCell = Cells(SR + i * 2, SC + (CurCusC ¥ RegC)) ②-1 ActiveSheet.Shapes.AddPicture _ (ActiveWorkbook.Path & "¥" & "okusan.bmp"), True, True, _ m y C e l l . L e ft + 3, myCell.Top + 3, 25, 46 CurCusC = CurCusC + 1 Else Exit For End If Next Loop DoEvents 'メッセージ表示 If MsgBox("スタートします", vbOKCancel) = vbCancel Then Exit Sub End If 'レジで処理する Do While ActiveSheet.Shapes.Count > 0 And Range("B2").Value < LimTime For i = 1 To CusS AddR = ActiveSheet.Shapes.Count Mod RegC AddC = ActiveSheet.Shapes.Count ¥ RegC Set myCell = Cells(SR + AddR * 2, SC + AddC) ②-2 ActiveSheet.Shapes.AddPicture _ (ActiveWorkbook.Path & "¥" & "okusan2.bmp"), True, True, _ myCell.Left + 3, myCell.Top + 3, 25, 46 Next DoEvents ③ Application.Wait (Now + TimeValue("00:00:01")) 9 For j = 1 To RegS For i = 1 To RegC If ActiveSheet.Shapes.Count = 0 Then Exit For ActiveSheet.Shapes(1).Delete Set myCell = Cells(SR + (i - 1) * 2, SC - 2) myCell.Value = myCell.Value + 1 DoEvents Next ActiveSheet.Columns(SC).Delete Next '処理時間カウントアップ Range("B2").Value = Range("B2").Value + 1 '残客数チェック R a nge("B4").Value = ActiveSheet.Shapes.Count Application.Wait (Now + TimeValue("00:00:01")) Loop End Sub 10 11
© Copyright 2024 ExpyDoc