Школьный этап Всероссийской олимпиады школьников по информатике 2017 (9-11 классы). Задача №4. «Плацкартный вагон»

Задача.

В плацкартном вагоне 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)

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (12 голос, значение: 3,67 из 5)
Загрузка...
Вы можете оставить комментарий, или ссылку на Ваш сайт.

Оставить комментарий

Антибот *