题目解析
我们可以把所有的照片和相框的宽度和长度放在一块,并按照宽度从大到小排序,如果一个照片和一个相框的宽度相同,则将相框放在前面。
接下来准备一个容器 SSS,并遍历排序后的照片和相框:
* 若当前为相框 (Ci,Di)(C_i, D_i)(Ci ,Di ),则将 DiD_iDi 放入 SSS 中。
* 若当前为照片 (Ai,Bi)(A_i, B_i)(Ai ,Bi ),则从 SSS 中找最小的大于等于 BiB_iBi 的元素,并将其从 SSS 中删除。如果无法找到这样的元素,说明这个照片无法找到一个相框来装裱,答案为 No\tt{No}No。
如果成功遍历完所有的元素,答案为 Yes\tt{Yes}Yes。
如果使用一个普通数组充当容器 SSS,那么以上算法的时间复杂度为 O(NM)O(NM)O(NM),但是我们可以使用 std::multiset 作为 SSS 来解决这个问题,时间复杂度为: O((N+M)log(N+M))O((N + M)\log{(N + M)})O((N+M)log(N+M))。
AC代码
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------