N
个整数数组分为K
和N-K
个元素的两个部分,以便最大化这两个部分中元素之和的差异。< / p>
TEST CASES
N=5, K=2
arr = [8 4 5 2 10]
O/P: 17 because (8+5+10) − (4+2) = 23 − 6 = 17.
N=8, K=3
arr= [1 1 1 1 1 1 1 1]
O/P: 2 because (1+1+1+1+1)-(1+1+1)=2
我要做的是首先对数组中的所有元素求和。然后,找到数组中最小K
个元素的总和,并从第一个元素中减去后者的两倍。
def smallestKSum(arr,K):
# returns the sum of the smallest K now. in the array
arr.sort()
r=0
for i in range(K):
r=r+arr[i]
return r
N,K = map(int,raw_input().split())
arr = map(int,raw_input().split())
s = sum(arr)
print s-(2*smallestKSum(arr,K))
上述解决方案在上述测试用例中运行良好,但在我尝试提交时仍然显示Wrong Solution
。您可以在此link查看问题。
我有什么遗失的东西吗?我可以在不对数组进行排序的情况下找到最小K
个的总和吗?
答案 0 :(得分:2)
您缺少的测试用例是k可能大于n-k。
所以将k设为min(n-k,k)
为什么不在同一个函数中找到剩余元素的总和,而不是总结所有并且再次减去。 试试这个:
def smallestKSum(arr,K):
# returns the sum of the smallest K now. in the array
arr.sort()
r=0
s=0
for a in arr[:K]:
r += a
for a in arr[K:]:
s += a
return s-m
返回值是您要求的答案
答案 1 :(得分:2)
有时,孩子应该承担更多的体重,以最大化差异。
例如,如果权重是[1,2,3,4],k是3,那么孩子应该[2,3,4]。
(2 + 3 + 4) - (1)= 8
不,[1,2,3]
(1 + 2 + 3) - (4)= 1
def smallestKSum(xs, k):
xs = sorted(xs)
return max(
abs(sum(xs[k:]) - sum(xs[:k])),
abs(sum(xs[-k:]) - sum(xs[:-k]))
)