В высокотехнологичном центре кибербезопасности круглые сутки работают автоматические системы анализа трафика. Каждое сканирование сети имеет время запуска и завершения (в миллисекундах от начала суток). Считается, что в момент запуска и в момент завершения сканирование всё ещё активно.
Необходимо проанализировать работу центра за сутки и определить интервалы (непрерывные промежутки времени), когда выполнялось хотя бы одно сканирование сети.
Входные данные:
В первой строке указано натуральное —
Следующие N строк содержат пары чисел: время начала и время окончания каждого сканирования (неотрицательные числа, меньшие 86 400 000).
Запишите в ответе два натуральных числа: сначала найденное количество периодов, когда выполнялось хотя бы одно сканирование, а затем их суммарную длительность (в мс).
Типовой пример организации данных во входном файле:
5
При таких исходных данных промежутков хотя бы с одним сканированием было 3: с 10 до 120 мс, с 130 до 2000 мс и с 250 до 400 мс. Их суммарная длительность равна
Ответ для
Типовой пример имеет иллюстративный характер. Для выполнения задания используйте данные из прилагаемых файлов.
Ответ:
Приведём решение на языке Python.
f = open('26.txt')
n = int(f.readline())
end_time = 86400000
time = sorted([int(i) for i in s.split()] for s in f)
time.append([end_time,end_time])
end = 0
time_no_activity =[]
for sec in time:
if end >= sec[0]:
end = max(end, sec[1])
else:
time_no_activity.append(sec[0]-end)
end = sec[1]
len_time_no_activity_start_and_stop = 0
if time[0][0]!= 0:
len_time_no_activity_start_and_stop += 1
if time[-1][1]!= 0:
len_time_no_activity_start_and_stop += 1
# Количество перодов активности больше количества периодов без активности на 1, минус количество периодов без активности (если есть!)
# до старта активности с начала суток и период после активности до завершения суток)
#Суммарное время периода активности равно разнице всего времени - время без активности
print(len(time_no_activity) + 1 - len_time_no_activity_start_and_stop, end_time - sum (time_no_activity))
Ответ: 359 86023641.
Приведём решение Юрия Красильникова на языке Python.
a = sorted([list(map(int,s.split())) for s in open('26.txt')][1:])
otr = [a[0]] # отрезки времени, в которых выполняется сканирование
for x in a[1:]:
if otr[-1][1]+1 >= x[0]:
otr[-1][1] = max(otr[-1][1],x[1])
else:
otr.append(x)
print(len(otr),sum([x[1]-x[0] for x in otr]))

