def draft(ranking): #
count = 0
for i in range(0, len(ranking) - 2):
for j in range(i+1, len(ranking) - 1):
for k in range(j+1, len(ranking)):
if ranking[i] <= ranking[j] and ranking[j] <= ranking[k]:
count += 1
return count
n = int(input())
for i in range(n):
li = list(map(int,input().split(' ')))
print(draft(li))
Мне поручено распечатать сумму всех возможных комбинаций команд из списка с ранжированием условий[i]
1 ответ
Вы можете добиться большего, чем $$ O (n ^ 3) $$ сложность у вас здесь. Вот более эффективный $$ O (n ^ 2) $$ алгоритм, который вы можете использовать:
Возьмите все элементы вместе и пометьте их, чтобы вы могли определить, в каком списке они изначально находились.
Сортировать список в $$ O (n log n) $$ время.
Теперь мы можем просмотреть список слева направо. Предположим, у нас есть упорядоченный список с метками 1123221321. Тогда количество действительных троек можно рассчитать в $$ O (n ^ 2) $$ время, отмечая, что мы хотим все возможности иметь $$ (1, 2, 3) $$ чтобы. Итак, в этом примере:
2 * 1 * 2 +
2 * 2 * 1 +
1 * 1 * 0
где первый член означает, что мы берем одну из первых двух единиц, затем одну из следующего блока двоек и одну из двух оставшихся троек, вторая сумма берет одну из первых двух единиц, одну из второго блока двоек и один из оставшихся трех. Наконец, взяв 1 из второго блока из 1, 1 из единственного оставшегося блока из 2, и трех больше не осталось.
![Как уменьшить время работы до менее 3 секунд? [closed] TheFAQ.ru](https://thefaq.ru/wp-content/uploads/2023/01/logo-250.png)