プログラムの実行結果は以下の通り。
乗り換え位置:全体の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; }