朝日新聞2006年11月10日パズル横丁解答

プログラムの実行結果は以下の通り。

乗り換え位置:全体の0.666667の位置
トータル時間:25分

図にすると以下の通り。

先にA君が1/3地点まで泳ぎ,そこから船で,B君は1/3地点まで船で,そこから泳ぎでもトータル時間の25分は変わらない。

その場合プログラムは,その部分を逆にする必要がある。

プログラムのソースは以下の通り。

#include "puzutl.h"

int main( int argc, cstring argv[])
{
  const int     DIST  = 300;    // 島から海岸までの距離(適当な値)
  const int     A = 3, B = 2, C = 1; // 各者の速度比(Cが船),45,30,15でも可。
  int           a, b;           // A,Bが島から海岸までかかる時間
  int           m = INT_MAX;    // A,Bが島から海岸までかかる最悪の時間(これを小さくするのが目標)
  int           pos = INT_MAX;  // 乗り換え場所
  for( int S=0; S< DIST; S++) { // 乗り換え場所を色々試す
    a           = 0;
    b           = 0;
    for( int L=0; L< DIST; L++) { // 距離
      if( L < S) {              // 乗り換え場所が来るまでA君が船を使うと仮定
        a       += C;           // 最初A君が船
        b       += B;           // B君は泳ぎ
      }
      else {
        a       += A;           // 乗り換え場所が来たらA君が泳ぎ
        b       += C;           // B君は船
      }
    }     
    if( a < m && b < m ) {      // 今までよりトータル時間が短ければ記録
      m         = max(a,b);     // より時間が掛かっている方を記録にする
      pos       = S;            // 乗り換え場所を記録する
    }
  }
  ps( "乗り換え位置:全体の%gの位置\n", (double)pos/DIST);
  ps( "トータル時間:%g分\n", (double)m*15/DIST/C);  // Cが15分でDISTに到着
  return    0;
}