我正在尝试使用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)
- 我们读入数组元素并将它们存储在列表
usableString
中 - 我们将两个变量
sum1
和sum3
分别设置为列表的第一个和最后一个元素 - 我们设置了一个变量来跟踪列表第一部分的最大和
- 最后,我们将变量
counting
设置为0,它将表示我们从列表中添加到sum1
或sum3
中的元素数量 - 逻辑的其余部分在while循环中,它只是检查
sum1
是否大于sum3
,或者相反,否则它们是否相等。在每次迭代之后,我们在计数上加1,因为一个额外的元素已经包含在一个部分中。当使用的元素数量(即counting
(等于数组中的元素数量-1时,while循环应该停止,因为我们在进入循环之前添加了第一个和最后一个元素,这使得(数组-2(,然而,我们仍然需要再循环一次,以检查sum1
和sum3
是否相等
我检查了您提交的算法,问题是您的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)