如果一个整数序列的每个元素都可以被4
整除,那么这个序列就是美丽的。在一个步骤中,您可以选择这个序列的任意两个元素,将它们从序列中移除,并将它们的和附加到序列中。计算使给定序列美观所需的最小步骤数,否则打印-1
(如果这不可能)。在
for i in range(int(input())):
n=int(input())
arr=list(map(int,input().split()))
if((sum(arr))%4)!=0:
print(-1)
continue
else:
counter=[]
for i in range(n):
if arr[i]%4!=0:
counter.append(arr[i])
else:
continue
x=sum(counter)
while(x%4==0):
x=x//4
print(x)
我的方法:如果数组的和不能被4
整除,那么数组就不可能是漂亮的,否则如果数组mod 4
的和等于0,我计算数组中mod by 4不等于零的元素并将它们追加到列表中,然后求出列表的和,然后将和除以4,直到它的商模4不等于零。什么我做错了?在
在编辑:我有一个有效的工作脚本
^{pr2}$
下面是一个与Ralf Kleberhoff建议的方向基本一致的O(N)实现:
我不太清楚你的问题是什么,但也许你可以改变一下解决问题的方法。你的逻辑似乎很好,但似乎你试图一次完成所有事情,如果你把它分解成碎片,这个问题就会容易得多。它看起来很适合分而治之/递归方法。我自己也自由地解决了这个问题,因为这似乎是一个有趣的问题。在
以下建议
您可以做的第一件事是编写一个函数,查找两个数的和可以被
k
整除,然后返回它们:此外,上面的函数是
O(n^2)
,这可以使效率更高。在其次,您可以编写一个递归函数,它使用上述函数,并且有一个基本情况,即当列表中的所有数字都可以被
^{pr2}$k
整除时,它停止递归,因此列表变得“漂亮”。以下是一种方法:上述代码的程序
k
整除,则返回当前累计的count
。在two_sum()
获得一对和可被k
整除的整数remove()
列表中的这两个数字,append()
到列表的末尾。在rec_helper()
,使用新的修改后的列表,count
递增1,即count + 1
。count
这是最小步骤数。在最后,您现在可以编写一个主调用函数:
它首先检查列表中数字的
sum()
是否可以被k
整除,然后继续调用rec_helper()
。如果它没有通过这个测试,函数只返回-1
,并且列表不能被设置为“漂亮”。在上述代码的行为
注意:上面的代码示例只是建议,您可以按照您想要的方式进行操作或使用。它也不处理
input()
,因为我相信代码中的主要问题是方法。我不想创建一个全新的解决方案来处理您的输入。如果上面的代码有问题,或者你什么都不懂,请在下面评论。在首先是一些观察:
算法:
最后,余数1、余数2和余数3计数应为零。在
相关问题 更多 >
编程相关推荐