- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
给定一个正数数组。我想将数组拆分为 2 个不同的子集,以使它们的 gcd(最大公约数)之和最大。
示例数组:{6,7,6,7}
。
答案:需要的两个子集是:{6,6}
和{7,7}
;它们各自的 gcd(s) 是 6 和 7,它们的 sum = 6+7=13
;这是可能的最大 gcd 总和。
Gcd:{8,12}
的 Gcd 是 {4}
,因为 4 是 8 和 12 的最大数。
注意:gcd(X)=X
如果子集只包含一个元素。
我的方法:通过暴力破解,找到数组所有可能的子序列,然后找到最大和,但如果输入大小大于 30 个数字,这将不起作用。我正在寻找更有效的方法。
Extra(s): 任何输入数字的最大大小为 10^9 ,时间限制:-1s 似乎不错,输入的大小可能与 10^5 一样大
最佳答案
我觉得这其实是一个容易的问题。
首先,让我们忽略值出现不止一次的可能性。显然,最好将一个值的所有拷贝放在同一个集合中,因为将其中一些拷贝移到别处只会损害 GCD(编辑:,除非只有一个不同的值)。所以我们假设所有元素都是不同的。此外,令 M 为任何元素的最大值。
这样想:有一个简单的解决方案,将最高元素放在一侧,将所有其余元素放在另一侧。 “其余所有”- GCD 可能为 1(当然可能更高),因此此解决方案为您提供 M+1。
具有多个不同元素的任何输入子集的 GCD 都不能高于 M/2(因为这样的一个除数必须乘以另一个至少为 2 的除数才能得到原始值,不高于 M)。所以编辑:最佳解决方案不能由两个集合组成,每个集合都有多个不同的元素。它必须是一个元素与所有其他元素。
现在考虑两个最高的元素,对于某些 d 具有值 M 和 M-d。如果我们不选择它们中的任何一个作为单例,则它们都在大组侧,这意味着该组的 GCD 最多为 d(因为如果 g|M 和 g|M-d 则 g|d);并且单例的贡献不会超过 M-d-1。所以总分最多为 M-1——也就是说,小于我们在选择最高值时得到的分数。 因此,输入中的最高值或第二高(不同)值必须在其自己的集合中。
因此,您必须执行以下操作:
关于c++ - 最大化二分法的 GCD(最大公约数)之和?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56503879/
我是一名优秀的程序员,十分优秀!