请帮我解决统一国家考试的第 26 题。我只需要解释解决方案,因为我完全不明白网站上回答的内容。
情况如下:在许多计算机系统中,当前时间以“UNIX 时间”格式存储 - 自 1970 年 1 月 1 日开始以来的秒数。
在一个计算机系统上进行了工作量研究。为此,从 UNIX 时间 1633046400 开始的一个月内,记录了该系统中运行的所有进程的开始和结束时间,并输入数据库。
您需要确定从 UNIX 时间 1634515200 开始的一周内系统上同时运行的最大进程数,以及运行此最大进程数的总时间(以秒为单位)。
输入数据:
输入文件的第一行包含一个整数 N — 整个观察期内的进程总数。接下来的 N 行每行包含 2 个整数:一个进程的开始时间和结束时间(UNIX 时间)。输入文件行中的所有数据都由一个空格分隔。
如果开始时间为零,则表示研究开始时该过程处于活动状态。如果完成时间为零,则意味着研究结束时该过程尚未完成。
当时间重合时,则认为所有过程的开始和完成都是同时发生的,即在相应的一秒的开始时。具体来说,如果一个进程的开始时间与另一个进程的结束时间重合,并且此时没有其他开始和结束,则此时活动进程的数量不会改变。
在您的答案中,写下两个整数:首先,从 UNIX 时间 1634515200 开始,一周内同时运行的最大进程数,然后是本周内此最大进程数运行的总秒数。
我试图解决它,但是我编写的代码执行时间太长了,如果它根本无法执行的话。代码:
start_time = 1633046400 # время начала эксперимента
end_time = 1633046400 + 60*60*24*7 # время конца эксперимента
f = open('26 (2).txt')
n = int(f.readline()) # считываю число процессов
count_start = 0 # счетчик процессов, которые происходят на всем времени эксперимента
current_count = 0 # счетчик процессов, которые происходят лишь на части времени
max_count = 0 # максимальный счетчик процессов, происходящих лишь на части времени
timer_count = 0 # счетчик времени, в течение которого происходило максимальное кол-во процессов
lsp = [] # список с началами процессов
lep = [] # список с концами процессов
for i in range(n):
start_proc, end_proc = f.readline().split() # считываю начало и конец одного процесса
if int(start_proc) <= start_time and (int(end_proc) >= end_time or int(end_proc) == 0): # проверяю, чтобы он происходил на протяжении всего эксперимента
count_start += 1
if (int(start_proc) > start_time and int(end_proc) < end_time) or (int(end_proc) > end_time > int(start_proc) > start_time) or (int(start_proc) < start_time < int(end_proc) < end_time): # проверяю, чтобы он происходил лишь на части эксперимента
lsp.append(start_proc) # добавляю время начала процесса
lep.append(end_proc) # добавляю время конца процесса
lsp = [int(i) for i in sorted(lsp)] # сортирую оба списка
lep = [int(i) for i in sorted(lep)]
for i in range(lsp[0],lep[-1]): # пробегаю через время работы всех процессов
if i in lsp: # прибавляю к счетчику процессов, если встретилось начало какого-либо процесса
current_count += 1
if i in lep: # вычитаю из счетчика процессов, если встретился конец какого-либо процесса
current_count -= 1
if current_count > max_count and start_time < i < end_time: # меняю максимальный счетчик, если нахожусь во времени проведения эксперимента
max_count = current_count
timer_count = 0 # обнуляю счетчик времени
timer_count += 1 # прибавляю ко времени, если счетчик процессов не становится больше
print(count_start + max_count, timer_count) # вывожу счетчики и время
我的主要想法是,如果我在迭代它们的运行时间时遇到任何一个进程的开始,我就把它添加到计数器中,如果它是结束,我就把它减去,但由于文件中的数字很大,代码不起作用。