Day 1 Task 2: 熱い, 冷たい(Hotter Colder)

ジャックとジルは 熱い,冷たい (Hotter, Colder) というゲームで遊んでいる. ジルは 1 以上 N 以下の 1 つの数を持つ. ジャックはその数が何であるかを推測することを繰り返す.

ジャックの推測は 1 以上 N 以下の数である. それぞれの推測に対して,ジルは,熱い (hotter),冷たい (colder), 同じ (same) のいずれかの返事をする. ジャックの最初の推測に対しては,ジルは同じ (same) を返す. 残りの推測に対しては,ジルは:

ジャックの役割を演じるプロシージャー HC(N) を実装せよ. 実装では Guess(G) を繰り返し呼び出すことができる. G は 1 以上 N 以下の数である. Guess(G)熱い (hotter) を表す 1 か 冷たい (colder) を表す -1 か 同じ (same) を表す 0 のいずれかを返す. HC(N) はジルの数を返す必要がある.

例えば, N = 5 とし,ジルが数 2 を選んだと仮定する. プロシージャー HC が以下に示す Guess の呼び出しを行ったとすると, 2 列目の結果が返される.
呼び出し(Call)返り値(Returned value)説明(Explanation)
Guess(5)0同じ (Same) (最初の呼び出し)
Guess(3)1熱い (Hotter)
Guess(4)-1冷たい (Colder)
Guess(1)1熱い (Hotter)
Guess(3)0同じ (Same)
この時点でジャックは答えを知っており, HC は 2 を返す必要がある. ジャックがジルの数を決めるのに 5 回の推測が必要であった. もっと良い方法もある.

小課題 1 [25点]

HC(N)Guess(G) を呼び出す回数は 500 回以下である. HC(N) が呼び出される回数は 125 250 回以下である. N は 1 以上 500 以下である.

小課題 2 [25点]

HC(N)Guess(G) を呼び出す回数は 18 回以下である. HC(N) が呼び出される回数は 125 250 回以下である. N は 1 以上 500 以下である.

小課題 3 [25点]

HC(N)Guess(G) を呼び出す回数は 16 回以下である. HC(N) が呼び出される回数は 125 250 回以下である. N は 1 以上 500 以下である.

小課題 4 [最高25点]

W を 2W≤3N をみたす最大の整数とする.この小課題におけるあなたの得点は次の通り.

HC(N) が呼び出される回数は 1 000 000 回以下である. N は 1 以上 500 000 000 以下である.

HCが呼ばれるごとに,そこで使われる変数を必ず初期化すること.

実装の詳細