划船问题

题意:

每个人有一个名字和一个姓氏,同名或同性可以做一条船,一条船最多做 2 人,求最少需要多少条船。

思路:

显然是匹配问题,但是朴素的匹配太慢了。

我们考虑如何优化。

人类智慧:我们建一个二叉树,以任意人为根,然后选一个和他同性的连在右子,同名的连在左子,以此类推。

不难发现我们现在可以将匹配转化为树上问题。

从下往上贪心,如果当前节点是某个右儿子,则我们让其子树内部匹配,最多多出一个人未匹配,则让这个人必须是右子树的,以此类推。

然后就可以在 \(O(n)\) 时间内解决这个问题了。

posted @ 2024-04-16 21:53  rlc202204  阅读(11)  评论(0编辑  收藏  举报