В одном городе есть более \(100\) жилых домов. Все дома пронумерованы, начиная с единицы. Управляющая компания получила заявки на капитальный ремонт от жителей домов. В заявке указан номер дома и номер подъезда, где требуется ремонт, при этом каждой заявке присваивается уникальный идентификатор – натуральное число, не превышающее \(1~000~000.\) На один и тот же подъезд могут быть заявки сразу от нескольких жителей.
Определите номер дома, который имеет наибольшее количество подряд идущих подъездов с заявками на капитальный ремонт. Если есть несколько домов с одинаковым максимальным количеством подъездов, необходимо выбрать тот дом, у которого наименьший искомый подъезд имеет максимальный номер заявки.
Входные данные
В первой строке входного файла находится натуральное число \(N\) \( (N \leqslant 200~000)\) – количество полученных заявок на капитальный ремонт. Следующие \(N\) строк содержат три числа: номер заявки, номер дома и номер подъезда (все числа натуральные, не превышающие \(1~000~000).\)
Выходные данные
Запишите в ответе два натуральных числа: сначала номер дома с максимальным количеством подряд идущих подъездов, затем номер первого найденного подъезда из максимального числа подряд идущих подъездов в этом доме.
Решение:
Python
f = open('26.txt')
N = int(f.readline())
# houses - словарь, ключём является номер дома, значение - словарь, у которого ключ - номер подъезда
# а значение, номер заявки на этот подъезд
houses = {}
for line in f:
z, d, p = map(int, line.split())
if houses.get(d) is None:
houses[d] = {p: z}
else:
if houses[d].get(p) is None:
houses[d][p] = z
else:
houses[d][p] = max(houses[d][p], z)
max_z = 0 # в этой переменной будем хранить максимальное кодичество подряд идущих подъездов с заявками на ремонт
max_h = [] # список пар: первое число - наименьший номер подъезда из подряд идущих, второе число - номер заявки на этот подъезд
for d, v in houses.items():
m = 1 # текущее значение подряд идущих подъездов
mm = 1 # максимальное число подряд идущих подъездов для данного дома
pod = sorted(list(v.keys())) # список подъездов
st = pod[0] # текущее значение наименьшего подъезда при сканировании
stm = pod[0] # наименьший номер подъезда в максимальной группе подряд идущих подъездов
for p in range(1, len(pod)): # сканируем весь массив
if pod[p] == pod[p-1] + 1:
m += 1
else:
if mm < m:
mm = m
stm = st
st = pod[p]
m = 1
if mm < m: # обработка хвоста массива
mm = m
stm = st
if mm > max_z:
max_z = mm
max_h = [(d, stm)]
elif mm == max_z:
max_h.append((d, stm))
res = [(d, p, houses[d][p]) for d, p in max_h]
res.sort(key=lambda r: r[2], reverse=True) # сортировка по номеру заявки. максимальный номер на первом месте
print(res[0][0], res[0][1])
Ответ: \(171 \,\, 701\)
Эффективно готовьтесь к ЕГЭ по информатике с новым тренажёром, эмулирующем работу станции КЕГЭ, которая используется на реальном экзамене