Python

Задача на Python помогите

помогите решить эту задачу
Смотрю я на такие решения, и на них красными буквами отпечатана мантра всех дилетантов от программирования: "Математиканенужнаааааааааа...."

Итак:
если n = 3, то комбинация всего одна, её нужно проверить на чётность
если n = 4, то есть варианты:
  • все чётные => нет нечётных сумм
  • 1 нечётное и 3 чётных => для нечётной суммы берём нечётное и любые 2 чётных
  • 2 нечётных и 2 чётных => для нечётной суммы берём любое нечётное и оба чётных
  • 3 нечётных и 1 чётное => для нечётной суммы берём все три нечётных числа
  • 4 нечётных => для нечётной суммы берём любые три нечётных числа
если n > 4, то нужно взять любую четвёрку чисел, содержащую нечётное число, и задача сводится к предыдущему случаю.

Таким образом, для n > 3 подходящая тройка существует тогда и только тогда, когда в последовательности есть хоть одно нечётное число. Поэтому не нужен никакой перебор всех троек кубической сложности, где для n = 300 будет перебираться более 4 миллионов вариантов. Достаточно линейного алгоритма поиска одного нечётного числа, который в худшем случае (если оно одно и последнее) даст 300 вариантов для перебора.

Код полностью:
 def has_odd_sum_triad(a):
return sum(a) % 2 != 0 if len(a) == 3 else any(filter((2).__rmod__, a))
def find_two_evens(a):
e = (i+1 for i in range(len(a)) if a[i] % 2 == 0)
return next(e, None), next(e, None)
def find_three_odds(a):
e = (i+1 for i in range(len(a)) if a[i] % 2 != 0)
return next(e, None), next(e, None), next(e, None)
def find_odd(a):
return next(i+1 for i in range(len(a)) if a[i] % 2 != 0)

t = int(input())
for _ in range(t):
_, a = int(input()), list(map(int, input().split()))
b = has_odd_sum_triad(a)
print(('NO', 'YES')[b])
if b:
if len(a) == 3:
triad = (1, 2, 3)
else:
e = find_two_evens(a)
triad = find_three_odds(a) if e[1] is None else (find_odd(a),) + e
print(*triad)
Можно, конечно, объединить has_odd_sum_triad и find_odd, чтобы не бегать по длинным спискам лишний раз, но на 300-х элементах это не особо важно. В худшем случае пробежим список дважды (т.е. 600 итераций). Заметим, что из поиска чётных и поиска нечётных чисел лишь один может быть долгим, а второй найдёт подходящее число сразу.
YT
Yashnarbek Turdiev
87 571
Лучший ответ
Поиск в массиве троек чисел с нечетной суммой ==>
 from itertools import permutations 

a = [41,3,84,10,7,3,8,23]
n = permutations(a,3)
b = list(filter(lambda x: sum(x) % 2, n))
print(b)
Miosemey Semey
Miosemey Semey
5 840
Yashnarbek Turdiev Там ведь 300 чисел может быть в строке, будешь генерировать в один список 4 млн пермутаций своих?