Задача к ЕГЭ по информатике на тему «Мусорки, кольцевая дорога» №4

На кольцевой автодороге с двусторонним движением находится N многоэтажных жилых домов (не более одного дома на каждом километре дороги). Длина кольцевой автодороги равна K км. Нулевой километр и K-й километр находятся в одной точке. Жители домов ежедневно заказывают доставку продуктов. Каждый магазин упаковывает продукты в пакеты, каждый из которых вмещает не более 27 кг. Каждый пакет используется для доставки почты только в один жилой дом, при этом в каждый дом может быть доставлено не более двух пакетов с неполной загрузкой. Известно, что курьеру хватает топлива не более чем на M км, заправка для обратного пути до магазина не учитывается. Магазин открыли в одном из домов таким образом, чтобы количество доставляемых пакетов с продуктами было максимальным.

Определите необходимое количество доставочных пакетов в этом магазине.

Входные данные

Дано два входных файла (файл A и файл B), каждый из которых в первой строке содержит три числа N, K и M число N (1 ≤ N ≤ 10000000,1 ≤ K ≤ 10000000,1 ≤ M ≤ 10000000)  -– количество жилых домов, длина кольцевой дороги в километрах и максимальное расстояние, на которое курьер может осуществлять доставку. В каждой из следующих N строк находится два числа: номер километра кольцевой автодороги, на котором расположен жилой дом, и вес пакета (все числа натуральные, вес продуктов для каждого дома не превышает 500 кг). Числа указаны в порядке расположения домов на автодороге.

В ответе укажите два числа: сначала значение искомой величины для файла А, затем – для файла В.

f = open(’27A__3nkwl.txt’)
N, K, M = map(int, f.readline().split())
a = []
for i in range(N):
    km, v = map(int, f.readline().split())
    km %= K
    package = v // 27 + (2 if v % 27 > 1 else 1)
    a.append([km, package])

b = [0]*K
for i in range(N):
    km, package = a[i]
    b[km] = package

b *= 2
start = M
s = 0
# Сумму можно считать только для существующего дома,
# поэтому первую сумму тоже нужно посчитать для первого дома из подходящих
for i in range(M, len(b)):
    if b[i] > 0:
        s = sum(b[i-M:i+M+1])
        start = i
        break
mx = s
for i in range(start+1, K + M * 2):
    s += (b[i+M] - b[i-M-1])
    if b[i]>0:
        mx = max(mx, s)
print(mx)

Ответ: 73 5161
Оцените статью
Я решу все!