Во многих компьютерных системах текущее время хранится в формате «UNIX-время» –— количестве секунд от начала суток января
года.
В одной компьютерной системе проводили исследование загруженности. Для этого в течение месяца с момента UNIX-времени фиксировали и заносили в базу данных моменты старта и финиша всех процессов, действовавших в этой системе.
Вам необходимо определить, какое наибольшее количество процессов выполнялось в системе одновременно на неделе, начавшейся в момент UNIX-времени , и в течение какого суммарного времени (в секундах) выполнялось такое наибольшее количество процессов.
Входные и выходные данные:
Первая строка входного файла 6.txt содержит целое число N –— общее количество процессов за весь период наблюдения. Каждая из следующих N строк содержит целых числа: время старта и время завершения одного процесса в виде UNIX-времени. Все данные в строках входного файла отделены одним пробелом.
Если в качестве времени старта указан ноль, это означает, что процесс был активен в момент начала исследования. Если в качестве времени завершения указан ноль, это означает, что процесс не завершился к моменту окончания исследования.
При совпадающем времени считается, что все старты и завершения процессов происходят одновременно, в начале соответствующей секунды. В частности, если время старта одного процесса совпадает с временем завершения другого и других стартов и завершений в этот момент нет, то количество активных процессов в этот момент не изменяется.
В ответе запишите два целых числа: сначала максимальное количество процессов, которые выполнялись одновременно на неделе, начиная с момента UNIX-времени , затем суммарное количество секунд, в течение которых на этих неделях выполнялось такое максимальное количество процессов.
Решение 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)