我应该循环多少次才能涵盖所有可能求和的情况



我正在尝试使用python3解决这个竞争性编程问题。问题是,给定一个大小为n的数组,将数组拆分为三个连续的连续部分,使第一部分具有最大和,等于第三部分的和。数组中的元素是正整数。

我的方法:

inputN = int(input())   
inputString = input()
usableString = stringToList(inputString)
counting = 0
sum1 = usableString[0]
sum3 = usableString[-1]
maxSum1 = 0
countFromLeft = 1
countFromRight = 2
while counting < inputN-1:
if sum1 > sum3:
sum3 += usableString[-countFromRight]
countFromRight += 1
elif sum3 > sum1:
sum1 += usableString[countFromLeft]
countFromLeft += 1
elif sum1 == sum3:
maxSum1 = sum1
sum1 += usableString[countFromLeft]
countFromLeft += 1
counting += 1
print(maxSum1)
  1. 我们读入数组元素并将它们存储在列表usableString
  2. 我们将两个变量sum1sum3分别设置为列表的第一个和最后一个元素
  3. 我们设置了一个变量来跟踪列表第一部分的最大和
  4. 最后,我们将变量counting设置为0,它将表示我们从列表中添加到sum1sum3中的元素数量
  5. 逻辑的其余部分在while循环中,它只是检查sum1是否大于sum3,或者相反,否则它们是否相等。在每次迭代之后,我们在计数上加1,因为一个额外的元素已经包含在一个部分中。当使用的元素数量(即counting(等于数组中的元素数量-1时,while循环应该停止,因为我们在进入循环之前添加了第一个和最后一个元素,这使得(数组-2(,然而,我们仍然需要再循环一次,以检查sum1sum3是否相等

我检查了您提交的算法,问题是您的stringToList函数:

def stringToList(s):
list=[]
for elem in s:
if elem != " ":
list.append(int(elem))
return list

据我所知,你的主要算法是完全好的,但stringToList做了一件关键的错误的事情:

>>> stringToList('2 4 6 8 10')
[2, 4, 6, 8, 1, 0]
# should be
[2, 4, 6, 8, 10]

由于它单独处理每个字符,10的两位数字就变成了1, 0。正确执行的一个更简单的方法是执行以下操作:

# explanation
>>> input()
'2 4 6 8 10'
>>> input().split(' ')
['2', '4', '6', '8', '10']
>>> map(int, input().split(' ')) # applies the int function to all elements
<map object at 0x...>
>>> list(map(int, input().split(' '))) # converts map object into list
[2, 4, 6, 8, 10]

很抱歉花了这么长时间,我最终制作了自己的算法来与你的算法进行比较,运行了自己的测试,然后用我刚才解释的输入列表方法运行了你的代码,并认为唯一的区别是你的stringToList函数。花了一段时间,但我希望它能有所帮助!

只是为了好玩,这是我的算法,结果发现它和你的算法非常相似!

array = [1, 3, 2, 1, 4]
n = len(array)
slice = [0, n]
sum = [array[0], 0]
bestSum = 0
while slice[0] < slice[1]-1:
i = 0 if (sum[0] < sum[1]) else 1
slice[i] += 1-(2*i)
sum[i] += array[slice[i]]
if sum[0] == sum[1]: bestSum = sum[0]
# print(array[ : slice[0]+1], array[slice[0]+1 : slice[1]], array[slice[1] : ])
print(bestSum)

最新更新