O(NM)O(NM) 解法

この問題は主菜、副菜の組を全探索することで正解でき、これは二重ループで実現できます。 計算量は O(NM)O(NM) で十分高速です。

以下は Python の実装例です。

O(NlogN+MlogM)O(NlogN + MlogM) 解法

ソート & 累積 max を活用することで、上の解法より更に高速に、O(NlogN+MlogM)O(NlogN + MlogM) で正解することもできます。 具体的な処理は以下のようになります。

  1. 主菜の値段と美味しさの組を、値段を基準に降順にソートします。
  2. 副菜の値段と美味しさの組を、値段を基準に昇順にソートします。
  3. ソート後の副菜で、累積 max を取ります。これにより、「値段が PP 円以下の副菜の最大の美味しさ」を求めることができるようになります。
  4. 値段で降順ソートした主菜の値段と美味しさの組を順に走査します。
  5. 累積 max を記録した配列のインデックス番号を管理しながら走査することで、O(N)O(N) で答えを求めることができます。

よって、ソートがボトルネックとなり、 O(NlogN+MlogM)O(NlogN + MlogM) で正解できます。 以下は Python の実装例です。