Вартість готелів занесемо у масив . Інтервал будемо називати хорошим, якщо сума вартостей готелів на ньому не більше .
Реалізуємо ковзне вікно за допомогою двох індексів і та будемо його підтримувати так, щоб поточний розглянутий інтервал був хорошим. Нехай — сума вартостей готелів на інтервалі . Якщо s + a[j + 1] \le m, то розширюємо поточний інтервал до a[i ... j + 1]. Інакше скорочуємо його до a[i + 1 ... j]. Знаходимо максимум серед вартостей усіх розглянутих хороших інтервалів.
Приклад
Розглянемо рух вказівників для наведеного прикладу.
i = 0, j рухається вперед, доки сума чисел на інтервалі не більше m = 12. Зупинимося на інтервалі , оскільки на ньому сума дорівнює , а на інтервалі сума дорівнює .
i = 1, j вперед посунути не можемо, оскільки сума на інтервалі дорівнює .
i = 2, j рухаємо вперед до інтервалу .
Максимальне значення серед усіх хороших інтервалів дорівнює і досягається на інтервалі .
Реалізація алгоритму
Читаємо вхідні дані.
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)