問題3 解説

 この問題の単純な解法は,入力ファイルに書かれた異なる n 個の整数から 2 つを選んでできる全ての順列を生成して,それらを小さい順に並べ替えて,小さい方から 3 番目を選ぶという方法であろう.この方法だと,全ての順列を生成するのに 2 重ループの部分で入力サイズ n の 2 乗のステップ数がかかる.n がそれ程大きくない場合は影響は顕著ではないが,非常に大きくなってくると処理にかかる時間が無視できなくなる可能性が出てくる.

 アルゴリズムの効率を考慮していくつかの工夫が考えられる.ここでは,全体の計算のオーダーを n にすることを考えてみよう.先ず,数として小さいものは桁数も小さいことは自明である.次に,全体で 2 つの順列が 3 番目のものを選ぶには,小さい方から何個用意すればいいかを考える.例えば,入力が 1, 2, 3, 4 の 4 個の場合は,小さい順に 12, 13, 14 となり,小さい方から 4 つまでのデータが必要となる.逆に,小さい方から 4 つを選んでおけば,全体で 2 つの順列が 3 番目になるのものは,この 4 つから作られることが分かる.これらのことから,次のような解法が考えられる.
  1. 入力を読みながら,小さい順に 4 つのデータを選ぶ.これらを 4 つの変数か,または長さ 4 の配列に小さい順にデータを入れていき,途中で小さいデータが来たら入れ替えて,それら 4 つが小さい順に並んでいるようにすればよい.この部分は n に比例するステップ数でできる.
  2. 1. で得られた 4 つの数から 2 つを選んで作られる順列を全て求める.この部分のステップ数は n に依存しない定数である.
  3. 2. で得られた順列を小さい順に並べ替えて,3 番目のものを求める.この部分のステップ数も n に依存しない定数である.
以上の 1. 〜 3. より,この解法の実行時間はオーダー n (n に比例する時間)となることがわかる.ただし,この解法では 4 つの小さい数を取っているので,入力の個数が 3 のときにも正解を計算するように注意することが必要である.