Тема 26. Обработка целочисленной информации с использованием сортировки

26.09 Прочие прототипы

Вспоминай формулы по каждой теме
Решай новые задачи каждый день
Вдумчиво разбирай решения
ШКОЛКОВО.
Готовиться с нами - ЛЕГКО!
Подтемы раздела обработка целочисленной информации с использованием сортировки
Решаем задачу:

Ошибка.
Попробуйте повторить позже

Задача 1#119216

На складе есть площадка, разделённая на M  рядов (пронумерованных от 1 до M  сверху вниз) и K  мест в каждом ряду (пронумерованных от 1 до K  слева направо). Некоторые места уже заняты другими ящиками. Необходимо разместить новый ящик, занимающий два соседних места в одном ряду, так, чтобы он находился как можно дальше от входа (в ряду с максимальным номером), и в тех же местах во всех рядах выше него не было других ящиков. Если в ряду есть несколько подходящих вариантов, выбрать места с наименьшими номерами.

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

Первая строка входного файла содержит три числа: N  — количество занятых мест (N  — натуральное, не превышает 100 000  ), M  — количество рядов, K  — количество мест в ряду. В следующих N  строках — по два числа: номер ряда и номер места, занятого ящиком (натуральные числа, не превышающие M  и K  соответственно).

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

Два целых положительных числа через пробел: номер ряда и наименьший номер места, куда можно поставить ящик.

Пример входного файла:

4  5  5

1  1

2  2

3  3

4  4

Ящик можно поставить в ряду 3  на места 4  и 5  , так как над этими местами нет занятых клеток. Ответ: 3  4  .

Вложения к задаче
Показать ответ и решение

Решение 1

f = open(’26_boxes.txt’)
n, m, k = map(int, f.readline().split())
a = sorted([list(map(int, i.split()))[::-1] for i in f])

places = [[] for i in range(k)]
for i in a:
    places[i[0]-1].append(i[1])
for i in range(k):
    if not(places[i]):
        places[i].append(m+1)
mx = x = 0
for i in range(k-1):
    current_min = min(places[i][0], places[i+1][0])
    if current_min > mx:
        mx = current_min
        x = i # Запоминаем индекс места
print(mx - 1, x + 1)

Решение 2

f = open(’26_boxes.txt’)
n, m, k = [int(x) for x in f.readline().split()]
field = [m + 1] * (k + 1)
for line in f:
    x, y = [int(i) for i in line.split()]
    field[y] = min(field[y], x)
res = [0, 0]
for i in range(1, k):
    mn = min(field[i], field[i + 1]) - 1
    if mn > res[0] and mn > 0 and not (field[i] == mn or field[i + 1] == mn):
        res = [mn, i]
    elif mn == res[0] and mn > 0 and not (field[i] == mn or field[i + 1] == mn):
        res[1] = min(res[1], i)
print(*res)

Ответ: 4033 35

Специальные программы

Все специальные программы

Программа
лояльности v2.0

Приглашай друзей в Школково и получай вознаграждение до 10%!

Крути рулетку
и выигрывай призы!

Крути рулетку и покупай курсы со скидкой, которая привязывается к вашему аккаунту.

Бесплатное онлайн-обучение

Для школьников из приграничных территорий России, проживающих в ДНР, ЛНР, Херсонской, Запорожской, Белгородской, Курской, Брянской областях и Крыму.

Налоговые вычеты

Узнай, как получить налоговый вычет при оплате обучения в «Школково».

Специальное предложение
для учителей

Бесплатный доступ к любому курсу подготовки к ЕГЭ, ОГЭ и олимпиадам от «Школково». Мы с вами делаем общее и важное дело, а потому для нас очень значимо быть чем-то полезными для учителей по всей России!

Вернём деньги за курс
за твою сотку на ЕГЭ

Сдать экзамен на сотку и получить обратно деньги за подготовку теперь вполне реально!

cyberpunkMouse
cyberpunkMouse
Рулетка
Вы можете получить скидку в рулетке!