Codility 任务 TapEquilibrium 正确性仅为 33%
Posted
技术标签:
【中文标题】Codility 任务 TapEquilibrium 正确性仅为 33%【英文标题】:Codility task TapEquilibrium correctness only 33% 【发布时间】:2015-11-09 07:16:23 【问题描述】:我尝试了 Codility 任务“TaskEquilibrium”,但在正确性标准下仅获得 33%。您可以在以下链接中查看我的 C++ 代码以及问题陈述:
https://codility.com/demo/results/trainingAPHQW7-UVM/
我在问题中的方法是最初计算数组元素的总和。然后我找到每次迭代的差异(第一次迭代不同)并更新最小绝对值。
我能够检查提到的测试用例,但没有收到其他一些用例的正确答案。
请查看我的代码并告知算法错误在哪里。 提前致谢。
【问题讨论】:
【参考方案1】:您的逻辑中的一个大缺陷是,您假设 P
至少为 1,但在某些情况下,P = 0
给了您最小的差异。
例如对于[1,-1]
的列表,您需要P=0
,以便它为您提供[]
和[1,-1]
,这将为您提供最小差异0
另一个问题是,当你遍历每个元素时,你还没有更新你的diff
(diff
总是sum of A[1..N] - A[0]
),因此temp = diff + 2*A[p-1];
不会给你有意义的结果p > 2
.
你的循环应该看起来像(伪代码):
minDiff = sum;
diff = sum;
for each (int a in A)
diff -= (a * 2);
if (abs(diff) < minDiff)
minDiff = abs(diff);
像这样只保留 diff 是个好主意,但如果它让你感到困惑,你为什么不简单地保留两个 var,例如sumOfFirstSection = 0; sumOfSecondSection = sum
,对A[]
中的每个元素都有一个循环,然后做sumOfFirstSection += A[i]; sumOfSecondSection -= A[i]
并相应地得出差异?
【讨论】:
可能是因为没有要回答的主题问题。如果您真的想回答这个问题,您还可以花一些时间使问题与主题相关,例如发布 MCVE,并指定一个明确的问题。 好吧,那么我认为是接受否决票的问题,而不是答案,不是吗?以上是关于Codility 任务 TapEquilibrium 正确性仅为 33%的主要内容,如果未能解决你的问题,请参考以下文章
Codility 任务 TapEquilibrium 正确性仅为 33%
Codility - CountDiv JavaScript解决方案
Codility峰的O(N * log(log(N)))算法?