この問題では主に二分探索、ゲームのシミュレーションを問います。
最初に見るとあまり求める答えのヒントがないように思えますが、もう一度問題をじっくりと注意深く見てみましょう。ゲームのルールより、
と書かれています。
このことから求める答え(ゲームを続けることのできる回数)を最大化するためには、場に出すカードに書かれた数値 が " より大きい数値の中で最小の値である" ようなカードを場に出すことが必要十分です。これを で求めると時間制限に間に合わないので、これを高速に計算するために二分探索を用いてそのような を で求めることで間に合うようになります。
またプレイヤーごとにカードを場に出す動作ですが、単調増加性により配列内から削除する必要はありません。さらに、最初にプレイヤー が出すカードの数値は先ほどの同様の性質から を場に出すことが適切です。
以上で全体で でこの問題に正解することができます。以下は解答例(C++)です。
追記:
制約上、 が間に合います。なので必ずしも二分探索を用いて実装する必要はありませんが、それを用いるとより高速に動作することだけ伝えておきます。 の実装方法ではここでは省略します。