C++
 Computer >> コンピューター >  >> プログラミング >> C++

パイプと貯水槽の問題の解き方|例題4問をわかりやすく徹底解説


「パイプと貯水槽(Pipes and Cisterns)」の問題は、公務員試験や就職試験など各種の適性試験で非常によく出題される定番テーマです。一見難しそうに感じますが、基本の考え方さえ身につければ決して苦手な分野ではありません。この記事では、基本ルールの確認から実際の解き方まで、例題を交えながらわかりやすく解説します。

パイプと貯水槽の問題とは?

このタイプの問題は、タンク(貯水槽)に水を入れるパイプや水を排出するパイプが登場し、「全部で何時間で満タンになるのか」「逆に空になるのか」を求めるものです。

まず、押さえておきたい基本ポイントを整理しましょう。

  • パイプには「給水管(注入口)」と「排水管(排出口)」の2種類があります。給水管はタンクに水を入れ、排水管はタンクから水を出します。

  • あるパイプが「n時間」でタンク一杯の水(容量cリットル)を満たす(または空にする)とき、1時間あたりには c/n リットルずつ作業が進みます。

  • 複数のパイプが同時に作動する場合、1時間あたりの変化量は次の式で求められます。

    1時間の変化量 = Σ(c/fi) − Σ(c/ej)

    ここで fi はi番目の給水管がタンクを満たすのにかかる時間、ej はj番目の排水管がタンクを空にするのにかかる時間です。

    計算結果の符号が正であればタンクは満ちていき、負であれば空になっていきます。

それでは、理解を深めるために具体的な問題を一緒に解いてみましょう。

問題1

2本のパイプがあり、それぞれ単独でタンクを満たすのに6時間と4時間かかります。両方を同時に開けた場合、タンクが満タンになるのは何時間後でしょうか。

解答

A管が1時間に満たすタンクの割合 = 1/6

B管が1時間に満たすタンクの割合 = 1/4

両方を同時に開けたとき、1時間に満たされる割合 = 1/6 + 1/4 = 5/12

したがって、A管とB管の2本でタンクを満たすのに必要な時間は 12/5 時間、すなわち2時間24分です。

問題2

タンクには3本のパイプがあります。うち2本は、それぞれ10時間と15時間かけてタンクを満たす給水管で、残りの1本は12時間かけてタンクを空にする排水管です。3本すべてを同時に開けた場合、タンクは何時間で満ちる(または空になる)でしょうか。

解答

A管が1時間に満たす割合 = 1/10

B管が1時間に満たす割合 = 1/15

C管が1時間に排出する割合 = 1/12

3本同時に開けたとき、1時間あたりの変化量 = 1/10 + 1/15 − 1/12 = 5/60 = 1/12

結果が正の値なので、タンクは徐々に満ちていきます。

よって、タンクが満タンになるまでにかかる時間は12時間です。

問題3

あるタンクに2本の給水管があります。2本を同時に使うと6時間でタンクが満たされます。また、単独で使った場合、片方のパイプはもう片方より5時間早くタンクを満たせます。それぞれのパイプが単独でタンクを満たすのにかかる時間を求めてください。

解答

速い方のパイプ1が単独でかかる時間を t 時間とします。

すると、パイプ2にかかる時間は t+5 時間となります。

パイプ1が1時間に満たす割合 = 1/t

パイプ2が1時間に満たす割合 = 1/(t+5)

2本同時に開けたとき、1時間に満たされる割合 = 1/t + 1/(t+5) = (2t+5)/[t(t+5)]

2本合わせて6時間で満たされるので、次の方程式が成り立ちます。

(2t+5)/[t(t+5)] = 1/6
12t + 30 = t² + 5t
t² − 7t − 30 = 0
t² − 10t + 3t − 30 = 0
t(t − 10) + 3(t − 10) = 0
(t + 3)(t − 10) = 0
t = 10

時間は負の値を取らないため、t = 10 が解となります。

パイプ1が単独で満たす時間 = 10時間

パイプ2が単独で満たす時間 = 15時間

問題4

3本のパイプA・B・Cがあります。Aは5時間でタンクを満たし、Bは15時間でタンクを満たします。Cはタンクを空にする排水管です。AとBだけを開けた場合に比べ、3本すべてを開けるとタンクが満たされるまでに15分余分にかかります。Cがタンクを空にするのにかかる時間を求めてください。

解答

タンクの容量を最小公倍数を使って LCM(5, 15) = 15 単位とおきます。

A管の効率 = 15 ÷ 5 = 3 単位/時間

B管の効率 = 15 ÷ 15 = 1 単位/時間

A+Bの合計効率 = 4 単位/時間

AとBだけで満たすのにかかる時間 = 15 ÷ 4 = 3時間45分

3本すべて開けた場合の所要時間 = 3時間45分 + 15分 = 4時間

このときの全体の効率 = 15 ÷ 4 = 3.75 単位/時間

C管の効率 = A+Bの効率 − 全体の効率 = 4 − 3.75 = 0.25 単位/時間

Cがタンクを空にするのにかかる時間 = 15 ÷ 0.25 = 60時間


  1. C言語とC++の構造体の違いを徹底解説

    本記事では、C言語の構造体とC++の構造体の違いについて詳しく解説します。C++の構造体は、C++のクラスとほぼ同じ性質を持っています。大きな違いのひとつとして、C言語の構造体ではすべてのメンバーがpublic(公開)であるのに対し、C++の構造体ではデフォルトでprivate(非公開)になる点が挙げられます。その他の違いについても、以下の表にまとめてご紹介します。C構造体とC++構造体の比較表C言語の構造体C++の構造体構造体内にメンバー関数を定義することはできません。メンバー変数に加えて、メンバー関数も定義できます。構造体のデータメンバーを宣言時に直接初期化することはできません。構造体のデ

  2. C++のdelete演算子とfree()関数の違いと使い方を徹底解説

    C++やC言語で動的に確保したメモリを解放する方法として、主にdelete演算子とfree()関数の2つがあります。本記事では、それぞれの構文、使い方、そして実際のコード例を通して、両者の違いをわかりやすく解説します。 delete演算子とは delete演算子は、new演算子によって動的に確保されたメモリを解放するために使用されます。プログラマは、この演算子を使って自分で作成したポインタ変数が指すメモリを自由に解放できます。 C++におけるdelete演算子の基本構文は以下の通りです。 delete ポインタ変数名; また、new[]で確保した配列形式のメモリブロックを解放する場合は、次の