
Python
Задача на Python помогите
помогите решить эту задачу

Смотрю я на такие решения, и на них красными буквами отпечатана мантра всех дилетантов от программирования: "Математиканенужнаааааааааа...."
Итак:
если n = 3, то комбинация всего одна, её нужно проверить на чётность
если n = 4, то есть варианты:
Таким образом, для n > 3 подходящая тройка существует тогда и только тогда, когда в последовательности есть хоть одно нечётное число. Поэтому не нужен никакой перебор всех троек кубической сложности, где для n = 300 будет перебираться более 4 миллионов вариантов. Достаточно линейного алгоритма поиска одного нечётного числа, который в худшем случае (если оно одно и последнее) даст 300 вариантов для перебора.
Код полностью:
Итак:
если n = 3, то комбинация всего одна, её нужно проверить на чётность
если n = 4, то есть варианты:
- все чётные => нет нечётных сумм
- 1 нечётное и 3 чётных => для нечётной суммы берём нечётное и любые 2 чётных
- 2 нечётных и 2 чётных => для нечётной суммы берём любое нечётное и оба чётных
- 3 нечётных и 1 чётное => для нечётной суммы берём все три нечётных числа
- 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 итераций). Заметим, что из поиска чётных и поиска нечётных чисел лишь один может быть долгим, а второй найдёт подходящее число сразу.Поиск в массиве троек чисел с нечетной суммой ==>
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)
Yashnarbek Turdiev
Там ведь 300 чисел может быть в строке, будешь генерировать в один список 4 млн пермутаций своих?
Похожие вопросы
- Задача в Python? Помогите решить, не получается! Решить нужно без функций и методов. Только циклы и условные операторы.
- Задача по python. Помогите решить через def (по возможности не использовать библиотеки) спасибо
- Задача на python Помогите пожалуйста
- Пожалуйста, помогите решить задачу на Python. Упражнения 57,58,59,60.
- Помогите решить задачу на Python. Никак не могу решить задачу, больше дня не могу найти ответ! Никакой код не работает.
- Решение задач по python
- Помогите пожалуйста с задачей на Python.
- Помогите пожалуйста с задачей по python!
- Пожалуйста, помогите решить задачу на Python. Упражнение 124, 125, 146
- Нужно решить задачу на Python