给出多个非零整数的集合,找到具有最大和的整数的多个子集,以使该多子集中没有两个元素彼此相邻。如果至少有两个这样的多子集,则选择该最小子集是候选多子集中所有最小元素中最大的那个多子集。
我看到了找到最大和的解决方案,但我也想要实际的多子集。另外,我不需要代码;我只想为我的代码提供一个失败的测试用例。
输入采用以下格式。
T positive integer (# of test cases)
N1 (positive integer followed by N1 integers representing the set whose "maximum sum" subset has to be identified)
a1 a2 a3 ... aN1
N2
...
NT
....
输出
a3a1
(必需的子集以相反的顺序-例如,a1 + a3在上面的第一组中形成最大和,因此输出为a3a1)
具体示例:
2
4
3 6 2 -2
4
4 5 3 4
输出
6
45
({4,4}和{3,5}都构成最大的和,但由于{4,4}中的最小元素> {5,3}中的最小元素而不会输出35)
我写了代码,它传递了我能想到的所有测试用例。但是它没有经过正式评估,我不知道失败的测试用例是什么。我的想法如下。集合中的第一个元素F是必需子集的成员,或者不是。如果是,则从原始集合的第三个元素开始递归地找到“最小总和”子集,并将其与F邻接。如果不是,则从原始集合的第二个元素开始递归地找到该子集。
下面是我编写的代码。有人可以给出失败的测试用例吗?
#returns 1 if all but the first element are negative
def all_neg(t):
sum=0
for i in range(1,len(t)):
if t[i]<0:
sum+=1
if sum==len(t)-1:
return 1
#reverses string
def reverse(t):
if len(t)<=1:
return t
else:
l=[t[-1]]
l.extend(reverse(t[:-1]))
return l
def max(a1,a2):
if a1>a2:
return a1
else:
return a2
#returns the sum of the subset with the maximum sum
def sum_max(t):
if len(t)==0:
return 0
elif len(t)==1:
return (t[0])
elif len(t)==2:
if t[0]>t[1]:
return t[0]
else:
return t[1]
else:
if t[0]>0:
if sum_max(t[2:])>0:
c1=t[0]+sum_max(t[2:])
else:
c1=t[0]
else:
return sum_max(t[1:])
c2=sum_max(t[1:])
return(max(c1,c2))
#returns the subset with the maximum sum
def arr_max(t):
if len(t)<=1:
return t
elif len(t)==2:
if t[0]>t[1]:
return [t[0]]
else:
return [t[1]]
elif sum_max(t)>sum_max(t[1:]):
if all_neg(t[1:]):
return([t[0]])
l=[]
l.append(t[0])
tmp=arr_max(t[2:])
l.extend(arr_max(t[2:]))
return l
elif sum_max(t)==sum_max(t[1:]):
l=[]
if (t[0]<0):
return arr_max(t[1:])
l.append(t[0])
l.extend(arr_max(t[2:]))
m=arr_max(t[1:])
sl=sum(l)
sm=sum(m)
if sl>sm:
return l
elif sm>sl:
return m
lm=min(l)
mm=min(m)
if lm<mm:
return m
else:
return l
else:
return arr_max(t[1:])
def main():
test=int(input())
for i in range(0,test):
N=int(input())
t=[int(s) for s in input().split()]
y=arr_max(t)
print(''.join(str(i) for i in reverse(y)))
main()