Top.Mail.Ru
Ответы

Задача по программированию

Урок физкультуры
На уроке физкультуры первоклассники построились в шеренгу. После объяснения правил выполнения строевых команд последовала команда «налево». При ее исполнении некоторые школьники повернулись налево, а некоторые — направо, перепутав направление поворота. Ученики, которые оказались лицом к лицу со своим соседом, подумали, что совершили ошибку (хотя ошибку совершил кто-то один из школьников пары). Чтобы её исправить, каждый из них быстро повернулся на 180∘. Если описанная ситуация затем опять повторялась, то есть какие-то рядом стоящие школьники оказывались лицом друг к другу, то они снова поворачивались на 180∘. Эта процедура продолжалась, пока в шеренге оставалась хотя бы одна пара стоящих лицом друг к другу учащихся.

Вам нужно составить программу, которая по расположению школьников сразу после исполнения команды «налево» вычисляет количество пар учащихся, совершивших впоследствии развороты на 180∘ в соответствии с вышеописанной процедурой.

Формат входных данных
Входные данные состоят из двух строк. В первой строке записано число N(2≤N≤105) — количество школьников в шеренге. Во второй строке содержится последовательность из N символов, каждый из которых может быть либо символом ’<’, либо символом ’>’ (символ ’<’ означает ученика по команде повернувшегося налево, символ ’>’—ученика, повернувшегося направо).

Формат выходных данных
Выходные данные должны содержать либо одно число—количество развернувшихся пар, либо число −1, если процесс бесконечен.

Система оценки
Все тесты в этой задаче оцениваются независимо.

Не проходит по времени. Да, алгоритм не быстрый, но нет вариантов как сделать по другому, если есть напишите пожалуйста.
Код:

123456789101112131415161718192021222324
 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() 
По дате
По рейтингу
Аватар пользователя
Новичок
1234567
 _, 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 - шеренга построена.
Для определения зацикливания создаём множество всех встретившихся комбинацией. И если очередная комбинация уже есть в множестве - процесс зациклился.