В вашем коде есть 2 конструкции, которые не позволяют дождаться ответа для файла b.
def ff(n):
global s; k = 0
for c in s:
if c <= n: k = c
else: break
return k
количество выполнений для каждого вызова растет до n, а этих вызовов у вас 2
for kol in range(max([c[1] for c in w]) + 1):
ww = [c for c in w if c[1] == kol]
if ww: aa.append(min(ww))
тут количество выполнений в среднем для файла a 15 000 и для файла b 150 000
Сложность вашего алгоритма чуть выше чем O(n^2).
Вам не нужно считывать сразу в массив весь файл, постарайтесь использовать память разумно. В условии есть подсказка, что вам нужно прибавлять значение только тогда, когда закончился пропуск (без этого замечания ответ будет таким же). Используйте метод префиксных сумм. Сложность алгоритма станет линейной.
Мне кажется, что лучше переписать большую часть кода. Не злоупотребляйте генераторами там, где это не нужно, например тут
max([c[1] for c in w])
Также давайте соответствующие имена переменным или пишете комментарии, если отправляете на форум 27 задание.
Желаю успехов!