首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >谦卑计数课

谦卑计数课
EN

Stack Overflow用户
提问于 2014-12-20 16:01:53
回答 2查看 1.5K关注 0票数 7

我正在学习谦逊计数课(https://codility.com/media/train/2-CountingElements.pdf),我需要帮助来理解最快的解决方案。

我想知道为什么第8行d //= 2中的差异被2除以2?这种差异难道不足以找到我们可以在数组之间交换的元素吗?

问题是:

给您一个整数m (1 < m < 1000000)和两个非空的零索引数组AB of n整数、a0a1、.、an−1b0b1、.、bn−1 (0 < aibi < m)。目的是检查是否存在可以对这些数组执行的交换操作,使数组A中的元素之和等于交换后数组B中的元素之和。交换操作意味着从数组A中选择一个元素,从数组B中选择一个元素并进行交换。

解决办法:

代码语言:javascript
复制
 def fast_solution(A, B, m):
   n = len(A)
   sum_a = sum(A)
   sum_b = sum(B)
   d = sum_b - sum_a
   if d % 2 == 1:
       return False
   d //= 2
   count = counting(A, m)
   for i in xrange(n):
       if 0 <= B[i] - d and B[i] - d <= m and count[B[i] - d] > 0:
           return True
   return False
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-12-20 16:09:02

A[i]和B[j]之间的交换将B[j]-A[i]添加到sum(A)中,sum(B)中减去相同的值;因此,它会影响两次 B[j]-A[i]的和差。

因此,将原来的差异减半是正确的(在检查它是偶数之后--如果是奇数,则没有交换将有效!-)以构成可能的交换的目标。

还请注意,它们提供的counting函数并不是现代Python的最佳功能--为了避免重新发明“计数项”的特定轮子,请参阅https://docs.python.org/2/library/collections.html#collections.Counter for Python2或https://docs.python.org/3/library/collections.html#collections.Counter for Python3。

票数 8
EN

Stack Overflow用户

发布于 2015-01-12 12:26:25

Ea = a0 + a1 + .. + a(n-1)。让Eb = b0 + b1 + .. + b(n-1)。然后交换元素aibj将对这些和产生以下影响:Ea - ai + bjEb + ai - bj。根据问题描述,那么这些和应该相等,所以Ea - ai + bj = Eb + ai - bj,让我们指定d = bj - ai。然后我们有以下等式:Ea + d = Eb - d,它给我们2d = Eb - Ead = (Eb - Ea)/2。关于(Eb - Ea)是奇数的情况,请参阅Alex的comment

唯一剩下的就是找到这样的bjai,以便bj - ai = d

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27581933

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档