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