划船问题
题意:
每个人有一个名字和一个姓氏,同名或同性可以做一条船,一条船最多做 2 人,求最少需要多少条船。
思路:
显然是匹配问题,但是朴素的匹配太慢了。
我们考虑如何优化。
人类智慧:我们建一个二叉树,以任意人为根,然后选一个和他同性的连在右子,同名的连在左子,以此类推。
不难发现我们现在可以将匹配转化为树上问题。
从下往上贪心,如果当前节点是某个右儿子,则我们让其子树内部匹配,最多多出一个人未匹配,则让这个人必须是右子树的,以此类推。
然后就可以在 \(O(n)\) 时间内解决这个问题了。