【问题标题】:Sum of OR of smallest and largest elements of each subset of a set集合的每个子集的最小和最大元素的 OR 和
【发布时间】:2018-05-14 04:34:04
【问题描述】:

给定一个集合 S,对于它的每个非空子集,找到最小和最大元素并取它们的逻辑 OR。在所有此类子集中找到这些 OR 的总和。

例如:S = {1, 2, 3},然后是子集

{1} 最小=1 最大=1 OR=1

{2} 最小=2 最大=2 OR=2

{3} 最小=3 最大=3 OR=3

{1, 2} 最小=1 最大=2 OR=3

{2, 3} 最小=2 最大=3 OR=3

{1, 3} 最小=1 最大=3 OR=3

{1, 2, 3} 最小=1 最大=3 OR=3

答案是 18。

我已阅读 How to find Sum of differences of maximum and minimum of all possible subset of an array,但无法在此处使用该逻辑。

【问题讨论】:

  • 你需要得到所有可能的组合并做OR?你不先写蛮力
  • 算法应该在代码中实现。由于不同的语言提供不同的工具,因此了解您所考虑的语言会很有帮助。
  • 从集合中选择任意两个元素,取它们的逻辑或。计算这两者之间的元素。确定可以从这 N+2 个元素中组成多少组。乘。冲洗并重复。

标签: algorithm set subset logical-operators


【解决方案1】:

算法

  • 对输入数据进行排序
  • i = 0 to n循环,其中n是输入的长度,j = i to n,由于输入是排序的,input[i]是最小的,input[j][i,j]范围内最大的
  • 现在我们知道input[i] 是最低的,input[j] 是最大的,我们还知道数组的中间元素有j - i -1,它们的组合将产生相同的最小值和最大值,因此我们将OR 的低位和高位,以及这些中间数字可能的排列总数。
  • 例如。对于input = [1, 2, 3, 4]i = 0j = 3,即lowest = 1largest = 4,我们知道元素[2, 3] 可以出现在子集中,而不会更改最小值和最大值。 [1, 2, 4], [1, 3, 4], [1, 2, 3, 4] 都是有效的。与中间元素可能的组合数量为2 ^ (count of middle elements)
  • 对所有最小和最大对重复此操作。

这是 C++ 中的代码。

#include <iostream>

int main() {
    vector<int> input {3, 2, 1};
    sort(input.begin(), input.end());
    int answer = 0;
    for(int i=0; i < input.size(); ++i)
    {
        for(int j=i; j < input.size(); ++j)
        {
            int elements = (j - i) - 1;
            int multiple = elements > 0 ? pow(2, elements) : 1;
            answer += ((input[i] | input[j]) * multiple);
            cout << input[i] << ' ' << input[j] << ' ' << answer << endl;
        }
        cout << endl;
    }
    cout <<  answer <<endl;
}

【讨论】:

  • 我认为没有比O(n^2) 更好的了。这实际上低于O(2^n)
猜你喜欢
  • 2018-10-31
  • 2017-09-09
  • 1970-01-01
  • 2022-11-13
  • 2013-06-04
  • 2016-12-28
  • 1970-01-01
  • 1970-01-01
  • 2017-01-12
相关资源
最近更新 更多