想想pidgeonhole。这种方法在所有情况下都是O(m + n)复杂度。
将每个“交易”合并为一组规则,然后遍历项目,将它们添加到每个满足其规则的pidgeonhole。
然后循环处理,从物品中拉出物品(如果物品在物品中)。
例子:
"blue car", "red car", "yellow expensive car", "red expensive car", "cheap car"
的交易:
buy a red car, get a blue car for free
buy an expensive car, get a cheap car for free
的 “规则”,我们可以推断出:
is_red, is_expensive, is_blue, is_cheap
因此,我们有2个孔,is_red和is_expensive。通过项目环,把它们添加到其规则,他们满足所有的孔,导致这些漏洞:
is_red ("red car", "red expensive car")
is_expensive ("red expensive car", yellow expensive car")
is_blue ("blue car")
is_cheap ("cheap car")
然后通过交易循环:
buy a red car, get a blue car for free
is_red contains "red car", is_blue contains "blue car", so:
pop them from the holes and make them a deal
下一笔交易:
buy an expensive car, get a cheap car for free
is_expensive doesn't contain any cars
太酷了!谢谢 :) – Drew 2012-03-12 16:30:17