Есть 24*60 = 1440
минут в день. Таким образом, вы можете легко перебрать его, так как вам не нужно получать точность с точностью до минуты. Однако я опишу простой DP.
Вы можете создать логический массив, в котором будет храниться информация о том, есть ли в эту минуту класс одного из учеников в группе. У вас также есть второй массив. Этот массив хранит количество открытых пространств в этом блоке и слева. Итак, вы можете пройти через логический массив справа налево, и если в блоке есть класс, вы делаете число 0, в противном случае вы делаете его равным 1 плюс число в предыдущую минуту.
Однако я чувствую, что мое объяснение отсутствует, поэтому вот псевдокод:
blocked = <boolean array>;
numtoleft = <array containing the counts>;
if blocked[0]:
numtoleft[0] = 0;
else:
numtoleft[0] = 1;
for i = 1 to 1440-1:
if blocked[i]:
numtoleft[i] = 0;
else:
numtoleft[i] = numtoleft[i-1];
Тогда вы можете легко найти самый большой открытый слот, найдя максимальное число в массиве 'numtoleft', и вы можете добавить ограничения на время, которое вы смотрите.
EDIT:
Вот алгоритм на python:
def largestslot(blocked, startminute, endminute):
numtoleft = [0]*1440
numtoleft[startminute] = 0 if blocked[startminute] else 1
for i in xrange(startminute+1, endminute+1):
numtoleft[i] = 0 if blocked[i] else 1
ansmax = max(numtoleft[startminute:endminute+1)
ansi = numtoleft.index(ansmax)
return (ansi-ansmax, ansi)