В настоящее время я пытаюсь решить задачу 'танцевальный концерт' kattis в Python 3. См. Здесь
После того, как я уловил количество выступлений Есть в танцевальном концерте, вы должны организовать выступления таким образом, чтобы последовательные выступления танцора были сведены к минимуму.
Я видел, как это задание выполнено в C ++, но мой код продолжал выполняться без времени, и я хотел оптимизировать его.
Вопрос: На данный момент, я генерирую все возможные перестановки производительности и запускаю сравнения из этого. Более быстрым способом было бы не генерировать все перестановки, поскольку некоторые из них просто перевернуты и привели бы к точно такому же выводу.
import itertools
print(list(itertools.permutations(range(2)))) --> [(0,1),(1,0)] #They're the same, backwards and forwards
print(magic_algorithm(range(2))) --> [(0,1)] #This is what I want
Как я мог бы сгенерировать такой список перестановок?
Я пробовал:
-Произвести все перестановки, снова обработать их, перевернуть () дубликаты и сохранить их. Это занимает слишком много времени, и результат не может быть жестко закодирован в решение, поскольку файл становится слишком большим.
-Только генерирует перестановки до середины пути, затем останавливается, предполагая, что после этого нет уникальных перестановок генерируются (не так, как я выяснил)
-Я здесь проверял вопросы, но, похоже, ни у кого такой же вопрос, как у меня, то же самое в Интернете
Вот мой текущий код:
from itertools import permutations
number_of_routines = int(input()) #first line is number of routines
dance_routine_list = [0]*10
permutation_list = list(permutations(range(number_of_routines))) #generate permutations
for q in range(number_of_routines):
s = input()
for c in s:
v = ord(c) - 65
dance_routine_list[q] |= (1 << v) #each routine ex.'ABC' is A-Z where each char represents a performer in the routine
def calculate():
least_changes_possible = 1e9 #this will become smaller, as optimizations are found
for j in permutation_list:
tmp = 0
for i in range(1,number_of_routines):
tmp += (bin(dance_routine_list[j[i]] & dance_routine_list[j[i - 1]]).count('1')) #each 1 represents a performer who must complete sequential routines
least_changes_possible = min(least_changes_possible, tmp)
return least_changes_possible
print(calculate())
Редактировать: Принял душ и решил, что добавление справочной таблицы для сравнения двух элементов ускорит его, так как многие операции повторяются. Все еще не исправляет итерации по всем перестановкам, но это должно помочь.
Редактировать: Найден другой поток, который ответил на этот вопрос довольно хорошо. Как создать перестановки списка без «обратных дубликатов» в Python с использованием генераторов
Спасибо всем!