Cowpatibility USACO

问题描述 投票:1回答:1

我对USACO Cowpatibility解决方案的说明和代码感到困惑。

问题在这里定义:http://usaco.org/index.php?page=viewproblem2&cpid=862

他们的解决方案在这里定义:http://usaco.org/current/data/sol_cowpatibility_gold_dec18.html

我知道他们的线性解决方案需要包含和排除(PIE)的属性,并且我理解此属性,但是我对他们如何实现它感到困惑。我正在寻找这些行的解释:

“这会激发以下包含/排除解决方案:对于每种风味子集,计算每个子集中多少对喜欢所有风味的奶牛。我们将大小1的子集的所有计数相加,然后避免重复计算,我们减去大小为2的子集的所有计数。然后,将大小为3的子集的所有计数相加,减去大小为4的子集的所有计数,并添加大小为5的子集的计数。“

它们如何确定每个可能的子集,这些子集是什么?为什么只有31N个子集?如果有人给出示例子集的子集示例,这也将有所帮助。

algorithm optimization language-agnostic combinatorics
1个回答
0
投票

31N个不同的子集,因为每头母牛都有五种可能的口味选择。具体来说,此行解释了这些子集:

我们可以显式生成所有风味子集,其中至少一头母牛喜欢该子集中的所有口味

这样做的方法是遍历所有N母牛,然后构建他们喜欢的风味的强大功能集,不包括空集。电源集中有2^5套,因此除去31中的空白集。因此,共有31N套。

一个示例在这里非常有用,采用示例输入:

4
1 2 3 4 5       # Cow 0
1 2 3 10 8      # Cow 1
10 9 8 7 6      # Cow 2
50 60 70 80 90  # Cow 3

子集将是:

{
  {1}, {1, 2}, {1, 3}, ..., {2, 3, 4, 5}, {1, 2, 3, 4, 5},    # Cow 0
  {1}, {1, 2}, {1, 3}, ..., {2, 3, 10, 8}, {1, 2, 3, 10, 8},  # Cow 1
  ...
}

每头牛产生31个子集。从那里开始,该算法会计算生成特定子集的母牛的数量(例如,请注意{1}是由母牛0和1共同生成的,我们只跟踪每个子集产生了多少母牛),并应用包含-根据子集大小进行排除。

[好问题,我曾经做过USACO,他们遇到了非常有趣的问题,这些问题仍然在许多公司给出的“聪明”面试问题中脱颖而出。 :)

© www.soinside.com 2019 - 2024. All rights reserved.