给我们一个带有n
值的数组。
例: [1,4,5,6,6]
对于i
数组的每个索引a
,我们构造一个数组的新元素,b
这样,
b[i]= [a[i]/1] + [a[i+1]/2] + [a[i+2]/3] + ? + [a[n]/(n?i+1)]
其中 [.]
表示最大整数函数。
我们也得到一个整数k
。
我们必须找到最小的i
这样b[i] ? k
。
我知道暴力破解O(n^2)
算法(创建数组-'b'),有人可以建议更好的时间复杂度和解决方法吗?
例如,对于输入[1,2,3]
,k=3
输出为1(minimum-index)
。
这里, a[1]=1; a[2]=2; a[3]=3;
现在, b[1] = [a[1]/1] + [a[2]/2] + [a[3]/3] = [1/1] + [2/2] + [3/3] = 3;
b[2] = [a[2]/1] + [a[3]/2] = [2/1] + [3/2] = 3;
b[3] = [a[3]/1] = …
给定一个正数数组。我想将数组拆分为2个不同的子集,以使它们的gcd(最大公约数)的总和最大。
数组示例:{6,7,6,7}
。
答案:两个必需的子集是:{6,6}
和{7,7}
; 它们各自的gcd是6和7,它们的sum = 6+7=13
;这是最大可能的gcd总和。
GCD:的GCD {8,12}
是{4}
作为图4是其将8以及12中的最大数目。
注意:gcd(X)=X
如果子集仅包含一个元素。
我的方法:通过暴力破解,找到数组的所有可能子序列,然后找到最大和,但是如果输入大小大于30个数字,则此方法不起作用。我正在寻找一种更有效的方法。
额外:任何输入数字的最大大小为10 ^ 9,时间限制:-1s似乎不错,输入大小可能高达10 ^ 5
有一棵有N个节点(编号1到N)的根树。节点“ 1”是根。每个节点都有一个值;让我们用A(i)表示节点i的值。
可以多次执行以下操作(包括零次):
1.选择树中仍然存在的任何节点,并删除该节点的整个子树,包括它本身。
2.让我们将利润定义为树中当前存在的所有节点的值之和减去X?k,其中k表示执行此操作的次数。找到最大可能的利润。
我们如何在这里计算“ k”值?(意味着删除时间节点数以获取最佳利润)
例:-
3(number of nodes,N) ,
5(X)
1 -5 -10 (Values of corresponding nodes)
(edge(s) from 'x'->'y')
1 2
2 3
Output: -4
We remove the sub-tree of node : 2'.
Now,value of our tree is: 1.
Finals answer:- 1-(x)*k,
(k=1); as we have performed the operation of removing the sub-tree only '1' time
: 1-(5)*1= -4.
Run Code Online (Sandbox Code Playgroud)
注意:没有给出树应该是二进制的,它也可以是普通树。