Задача.
В плацкартном вагоне 54 места, пронумерованных числами от 1 до 54. Вагон разбит на 9 купе. Первые 36 мест расположены по левую сторону от прохода, места 1–4 находятся
в первом купе, места 5–8 – во втором и т. д. В девятом купе находятся места с номерами 33–36. По правую сторону от прохода находятся боковые места, их номера от 37 до 54, причём
они нумеруются в противоположном направлении: места 37 и 38 находятся напротив девятого купе, а места 53 и 54 – напротив первого. Ниже приведена схема всех мест в вагоне.
Группа школьников едет на олимпиаду и будет всю дорогу крутить спиннеры. Поэтому им нужно купить места в нескольких подряд идущих купе вместе с прилегающими
боковыми местами. Даны номера свободных мест в поезде. Определите, какое наибольшее число подряд идущих купе полностью свободны.
Программа получает на вход число N – количество свободных мест в вагоне (0 ≤ N ≤ 54). Следующие N строк содержат номера свободных мест – различные числа от 1 до 54 в произвольном порядке, по одному числу в строке.
Программа должна вывести одно целое число – максимальное число подряд идущих свободных купе (купе – 4 места слева от прохода и 2 боковых места) в этом вагоне.
Решение.
Представим купе выгона в виде списка, заполненного нулями.
v = [0, 0, 0, 0, 0 ,0, 0, 0, 0]
9 купе в вагоне — 9 элементов списка.
Первая часть решения заключается в том, чтобы записать в список количество свободных мест в каждом купе.
Т.е. если вводится число 3 — это значит свободно третье место в первом купе. Получим новый список
v = [1, 0, 0, 0, 0, 0, 0, 0, 0]
И так далее. Я реализовывал это с помощью девяти условий. Если есть вариант интереснее — предлагайте, пишите в комментариях. Рассмотрим код программы данной части решения задачи.
#создаем вагон из 9 купе в виде списка
v = [0,0,0,0,0,0,0,0,0]
#вводим количество мест, которые будут свободны
#мы их будем вводить в цикле ниже
n = int(input())
#вводим свободные места и проверяем в каком они купе
for i in range(n):
m = int(input())
if 1<=m<=4 or m == 53 or m == 54:
v[0] += 1
elif 5<=m<=8 or m == 51 or m == 52:
v[1] += 1
elif 9<=m<=12 or m == 49 or m == 50:
v[2] += 1
elif 13<=m<=16 or m == 47 or m == 48:
v[3] += 1
elif 17<=m<=20 or m == 45 or m == 46:
v[4] += 1
elif 21<=m<=24 or m == 43 or m == 44:
v[5] += 1
elif 25<=m<=28 or m == 41 or m == 42:
v[6] += 1
elif 29<=m<=32 or m == 39 or m == 40:
v[7] += 1
elif 33<=m<=36 or m == 37 or m == 38:
v[8] += 1
#при сдаче в тестирующую систему данная команда не используется
print(v)
Теперь вторая часть решения: необходимо в получившемся списке посчитать наиболее количество подряд идущих свободных купе.
Для этого нам понадобятся две переменные:
- max — будем хранить в ней ответ на задачу
- f — текущее значение количества свободных мест в купе
Просматриваем значения списка в цикле. Если значение элемента списка равно 6 (6 мест в купе должно быть свободно, чтобы мы его посчитали), мы увеличиваем текущее значение подряд идущих купе f на единицу. А потом сравниваем это значение с max, которое при запуске программы равно нулю (max = 0). Как только число свободных мест в вагоне оказывается не равно шести, мы сбрасываем переменную f (f = 0).
Теперь запишем полный код программы:
#создаем вагон из 9 купе в виде списка
v = [0,0,0,0,0,0,0,0,0]
#вводим количество мест, которые будут свободны
#мы их будем вводить в цикле ниже
n = int(input())
#вводим свободные места и проверяем в каком они купе
max = 0
flag = 0
for i in range(n):
m = int(input())
if 1<=m<=4 or m == 53 or m == 54:
v[0] += 1
elif 5<=m<=8 or m == 51 or m == 52:
v[1] += 1
elif 9<=m<=12 or m == 49 or m == 50:
v[2] += 1
elif 13<=m<=16 or m == 47 or m == 48:
v[3] += 1
elif 17<=m<=20 or m == 45 or m == 46:
v[4] += 1
elif 21<=m<=24 or m == 43 or m == 44:
v[5] += 1
elif 25<=m<=28 or m == 41 or m == 42:
v[6] += 1
elif 29<=m<=32 or m == 39 or m == 40:
v[7] += 1
elif 33<=m<=36 or m == 37 or m == 38:
v[8] += 1
#при сдаче в тестирующую систему данная команда не используется
print(v)
for i in range(9):
if v[i] == 6:
f += 1
if flag > max:
max = f
else:
flag = 0
print(max)