Задача по программированию
Урок физкультуры
На уроке физкультуры первоклассники построились в шеренгу. После объяснения правил выполнения строевых команд последовала команда «налево». При ее исполнении некоторые школьники повернулись налево, а некоторые — направо, перепутав направление поворота. Ученики, которые оказались лицом к лицу со своим соседом, подумали, что совершили ошибку (хотя ошибку совершил кто-то один из школьников пары). Чтобы её исправить, каждый из них быстро повернулся на 180∘. Если описанная ситуация затем опять повторялась, то есть какие-то рядом стоящие школьники оказывались лицом друг к другу, то они снова поворачивались на 180∘. Эта процедура продолжалась, пока в шеренге оставалась хотя бы одна пара стоящих лицом друг к другу учащихся.
Вам нужно составить программу, которая по расположению школьников сразу после исполнения команды «налево» вычисляет количество пар учащихся, совершивших впоследствии развороты на 180∘ в соответствии с вышеописанной процедурой.
Формат входных данных
Входные данные состоят из двух строк. В первой строке записано число N(2≤N≤105) — количество школьников в шеренге. Во второй строке содержится последовательность из N символов, каждый из которых может быть либо символом ’<’, либо символом ’>’ (символ ’<’ означает ученика по команде повернувшегося налево, символ ’>’—ученика, повернувшегося направо).
Формат выходных данных
Выходные данные должны содержать либо одно число—количество развернувшихся пар, либо число −1, если процесс бесконечен.
Система оценки
Все тесты в этой задаче оцениваются независимо.
Не проходит по времени. Да, алгоритм не быстрый, но нет вариантов как сделать по другому, если есть напишите пожалуйста.
Код:
def main():
n = int(input())
R = list(input())
l = 0 # количество развернувшихся пар
d = 0 # если d = 0, то поворота нет, если d = 2, то поворот есть
i = 0 # индекс списка
for cycle in range(40000000):
if R[i] == ">" and R[i + 1] == "<":
R[i] = "<"
R[i + 1] = ">"
i += 1
l += 1
d = 2
else:
i += 1
if i == n - 1:
i = 0
if d == 0:
print(l)
exit(0)
else:
d = 0
print(-1)
main()
_, r, c, n, t = input(), input(), 0, -1, set()
while n and r not in t:
t.add(r)
n = r.count('><')
r = r.replace('><', '<>')
c += n
print(-1 if n else c)
Кол-во разворотов пар находим стандартным методом count.
Разворот пар делаем стандартным методом replace.
Если на очередном шаге кол-во разворотов равно 0 - шеренга построена.
Для определения зацикливания создаём множество всех встретившихся комбинацией. И если очередная комбинация уже есть в множестве - процесс зациклился.