Разбор
Стоимости отелей занесем в массив . Интервал будем называть хорошим, если сумма стоимостей отелей на нем не больше .
Реализуем скользящее окно при помощи двух индексов и и будем его поддерживать так, чтобы текущий рассматриваемый интервал был хорошим. Пусть — сумма стоимостей отелей на интервале . Если , то расширяем текущий интервал до . Иначе сокращаем его до . Находим максимум среди стоимостей всех рассматриваемых хороших интервалов.
Пример
Рассмотрим движение указателей для приведенного примера.
движется вперед пока сумма чисел на интервале не больше . Остановимся на интервале , так как на нем сумма равна , а на интервале сумма равна .
подвинуть вперед не можем так как сумма на интервале равна .
двигаем вперед до интервала .
Максимальное значение среди всех хороших интервалов равно и достигается на интервале .
Реализация алгоритма
Читаем входные данные.
scanf("%d %lld", &n, &m);
Инициализируем переменные:
в вычисляется максимальная стоимость среди стоимостей всех обрабатываемых хороших интервалов;
в поддерживается сумма чисел на текущем интервале . Все числа текущего интервала содержатся в очереди ;
s = res = 0;
Последовательно обрабатываем стоимости отелей.
for (i = 0; i < n; i++) {
Читаем и добавляем стоимость текущего отеля в очередь.
scanf("%d", &val); q.push(val);
Обновляем сумму на интервале. Все элементы текущего интервала находятся в очереди .
s += val;
Если сумма чисел на текущем интервале больше , то удаляем элементы с начала интервала.
while (s > m) { s -= q.front(); q.pop(); }
Вычисляем максимальное значение среди сумм элементов допустимых интервалов (стоимость отелей на которых не превышает ).
if (s > res) res = s; }
Выводим ответ.
printf("%lld\n", res);
Python реализация
Объявим очередь.
from collections import deque q = deque()
Читаем входные данные.
n, m = map(int, input().split()) costs = list(map(int, input().split()))
Инициализируем переменные:
в вычисляется максимальная стоимость среди стоимостей всех обрабатываемых хороших интервалов;
в поддерживается сумма чисел на текущем интервале . Все числа текущего интервала содержатся в очереди ;
res = s = 0
Последовательно обрабатываем стоимости отелей.
for val in costs:
Добавляем стоимость текущего отеля в очередь.
q.append(val)
Обновляем сумму на интервале. Все элементы текущего интервала находятся в очереди .
s += val
Если сумма чисел на текущем интервале больше , то удаляем элементы с начала интервала.
while s > m: s -= q.popleft()
Вычисляем максимальное значение среди сумм элементов допустимых интервалов (стоимость отелей на которых не превышает ).
if s > res: res = s
Выводим ответ.
print(res)