Задача к ЕГЭ по информатике на тему «Программирование — Обработка целочисленной информации с использованием сортировки» №1

Во многих компьютерных системах текущее время хранится в формате «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
Оцените статью
Я решу все!