【发布时间】:2017-03-12 04:26:55
【问题描述】:
问题如下:
给定一个大小为n 的数组,我们可以对其执行k 操作。在每个操作中,任何元素都可以分为a和b两个数字,这样(a+b)是前一个元素,新的元素个数是n+1。那么作为数组的最大元素,我们能得到的最小数是多少呢?
例如:
假设n=3 和k=2
数组由:
3 3 4
一次操作后:3 3 2 2
第二次手术后:3 1 2 2 2
因此答案是3,因为它是数组最大值的可能最小值。
我试图为此想出一个算法,但每个算法都是O(n^2)。我正在考虑检查每个数字是否有可能直到数组的最大元素=>n^2。
我想到的算法是将i=1 带到i=k,在那里我检查i 的解决方案是否可能。当每个大于i 的数字被分成组时,i 是可能的。例如,取一个数字x。 x可以分为x/i一组i和另一组x%i(如果!=0)。如果没有。组是y,我们需要y-1 操作。我得到的第一个i 就是答案。
有没有更好的算法可以解决这个问题。
【问题讨论】:
-
据我所知,逻辑是找出数组中的最大数,如果不是第一个,则将其拆分(偶数:除以二;奇数:除乘二并在左边加一 (a) 而不是 b) 并继续重复该过程直到迭代
k次。 -
@KaushikNP 在这种情况下复杂度是
O(knlogn)。 -
哦,对不起,我当时在想python。为了找到最大元素本身,在 C 中出现了另一个循环。所以是的,不会成功。
-
@KaushikNP:即使拆分也不总是最佳的。例如,如果您使用初始数组
{6}和 2 个拆分进行偶数拆分,则第一个拆分为{3, 3},第二个拆分为{3, 2, 1},但最佳结果是{2, 2, 2}。 -
@user2357112....正是....这正是我每次都得到
n^2的复杂性的原因
标签: c++ algorithm time-complexity