1日目 問題1(ゲーム)

 次のような2人ゲームを考える。ゲーム盤には正の整数が一列に並んでいる。 2人のプレーヤーは交互にプレイを行う。プレーヤーはゲーム盤上の列の左端か 右端の数字のどちらかを選択し、選択した数字をゲーム盤から消去する。 ゲームはすべての数が選択されると終了する。先手(始めにプレーするプレー ヤー)は後手(2番目にプレーするプレーヤー)の得点以上の得点を獲得すれば 勝ちとなる。後手は最善を尽くすものとする。
 最初にゲーム盤に並んでいる数の個数がもし偶数であれば 先手必勝の戦術が存在する。先手が必ず勝つようなプログラムを書きなさい。 後手の応答(指し手)は、あらかじめ用意されているコンピュータ上の プログラムによって与えられるものとする。先手と後手はモジュール Play (これはあなたが利用できるようになっている)の3つの手続き (procedure) を 用いてやりとりする(コミュニケートする)。3つの手続きは、 StartGame, MyMove, YourMove である。
 先手はパラメータをとらない手続き StartGame を実行することにより ゲームを始めなければならない。もし先手が左端 (Left end) の数字を選択する ならば、手続き MyMove('L') を実行する。同様に、右端 (Right end) の数字を 選択をするならば、手続き MyMove('R') を実行する。 後手、つまり、コンピュータはすぐにプレーを行う。 そして、先手は命令 YourMove(C) を実行することによって、この手 (後手の打った手)について知ることができる。ここで、C は文字型の変数で ある(C または C++ では、この命令を YourMove(&C) と書く)。 変数 C の値は、後手が左端を選ぶか右端を選ぶかによって、 それぞれ 'L' か 'R' をとる。

入力データ

 ファイル INPUT.TXT の第1行には初期のゲーム盤上の数の個数 N が書いてある。 N は偶数で、2≦N≦100 である。残りの N 行は、各行に1つずつ数が書いてあり、 それは初期のゲーム盤の上に置かれている数を左から右に並べたものである。 どの数も200以下である。

出力データ

 ゲームが終了したとき、あなたのプログラムはファイル OUTPUT.TXT に ゲームの最終結果を書き出さなければならない。出力ファイルの第1行に2つの数 を出力せよ。1番目の数は先手が選択した数の総和、2番目の数は後手が選択した 数の総和であること。あなたのプログラムはゲームを行わなければならず、 出力はプレイしたゲームに対応したものでなければならない。

入出力の例

 次は、あるゲーム盤の初期状態を記述した入力ファイルと、 それに対して考えられる出力ファイルの例である。

    INPUT.TXT        OUTPUT.TXT
    ---------        ----------
    6            15 14
    4
    7
    2
    9
    5
    2

図1