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

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

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

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

Задача 1#30261

Во многих компьютерных системах текущее время хранится в формате «UNIX-время» –— количестве секунд от начала суток 1  января 1970  года.

В одной компьютерной системе проводили исследование загруженности. Для этого в течение месяца с момента UNIX-времени 1633046400  фиксировали и заносили в базу данных моменты старта и финиша всех процессов, действовавших в этой системе.

Вам необходимо определить, какое наибольшее количество процессов выполнялось в системе одновременно на неделе, начавшейся в момент UNIX-времени 1634515200  , и в течение какого суммарного времени (в секундах) выполнялось такое наибольшее количество процессов.

Входные и выходные данные:

Первая строка входного файла 6.txt содержит целое число N –— общее количество процессов за весь период наблюдения. Каждая из следующих N строк содержит 2  целых числа: время старта и время завершения одного процесса в виде UNIX-времени. Все данные в строках входного файла отделены одним пробелом.

Если в качестве времени старта указан ноль, это означает, что процесс был активен в момент начала исследования. Если в качестве времени завершения указан ноль, это означает, что процесс не завершился к моменту окончания исследования.

При совпадающем времени считается, что все старты и завершения процессов происходят одновременно, в начале соответствующей секунды. В частности, если время старта одного процесса совпадает с временем завершения другого и других стартов и завершений в этот момент нет, то количество активных процессов в этот момент не изменяется.

В ответе запишите два целых числа: сначала максимальное количество процессов, которые выполнялись одновременно на неделе, начиная с момента UNIX-времени 1634515200  , затем суммарное количество секунд, в течение которых на этих неделях выполнялось такое максимальное количество процессов.

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

Решение 1

f = open(r"C:\\Users\\Тимофей\Desktop\\n3.txt")
start_week = 1_634_515_200
finish_week = start_week + 7 * 24 * 60 * 60
start_month = 1_633_046_400
finish_month = start_month + 31 * 24 * 60 * 60
n = int(f.readline())
st, fn = [], []  # st - массив стартов, fn - массив финишей
k, maxim = 0, 0  # k - число сейчас активных процессов, maxim - максимальное число активных процессов на неделе
for i in range(n):
    a, b = map(int, f.readline().split())  # a, b - время начала и конца i-го процесса
    if a == 0:  # Если процесс начался до исследования
        a = start_month
    st.append(a)
    if b == 0:  # Если процесс кончился после исследования
        b = finish_month
    fn.append(b)

st.sort()
fn.sort()

# 2 указателя: i - для стартов, j - для финишей
i, j = 0, 0

while i < len(st):
    if st[i] < fn[j]:
        k += 1
        # if для случая, когда ни один процесс не начинается на неделе
        if (i < len(st) - 1) and st[i] < start_week and st[i + 1] > finish_week:
            maxim = max(maxim, k)
        if k > maxim and st[i] >= start_week and st[i] < finish_week:
            maxim = k
        i += 1
    else:
        k -= 1
        j += 1

i, j = 0, 0
k, ans = 0, 0
                                                                                                     
                                                                                                     

for sec in range(start_month, finish_month):
    # считаем число начатых и кончившихся процессов в каждую секунду sec
    while i < len(st) and st[i] == sec:
        k += 1
        i += 1
    while j < len(fn) and fn[j] == sec:
        k -= 1
        j += 1
    if k == maxim:
        ans += 1 # промежуток [sec; sec + 1)

print(maxim, ans)

Решение 2

f = open(r"C:\\Users\\Тимофей\Desktop\\n3.txt")
n = int(f.readline())
start_month = 1_633_046_400
finish_month = start_month + 31 * 24 * 60 * 60
start_week = 1_634_515_200
finish_week = start_week + 7 * 24 * 60 * 60
k = 0
borders = []
for sec in range(n):
    x, y = map(int, f.readline().split())
    if x == 0:
        x = start_month
    if y == 0:
        y = finish_month
    borders.append([x, 1])
    borders.append([y, -1])

borders.append([start_week + 1, 0])
borders.sort()
maxim = -1000000000000

time = sorted(set(x[0] for x in borders))

t = 0
ans = 0

for sec in time:
    while t < len(borders) and borders[t][0] == sec:
        k += borders[t][1]
        t += 1
    if k > maxim and sec >= start_week and sec < finish_week:
        maxim = k
    if sec > finish_week:
        break

t = 0
k = 0

                                                                                                     
                                                                                                     
for sec in range(start_month, finish_month):
    while t < len(borders) and borders[t][0] == sec:
        k += borders[t][1]
        t += 1
    if k == maxim:
        ans += 1

print(maxim, ans)

Ответ: 7768 1826

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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