Готелі на хорватському узбережжі#10682

Готелі на хорватському узбережжі (Розбір)

Вартість готелів занесемо у масив . Інтервал будемо називати хорошим, якщо сума вартостей готелів на ньому не більше .

Реалізуємо ковзне вікно за допомогою двох індексів і та будемо його підтримувати так, щоб поточний розглянутий інтервал був хорошим. Нехай — сума вартостей готелів на інтервалі . Якщо s + a[j + 1] \le m, то розширюємо поточний інтервал до a[i ... j + 1]. Інакше скорочуємо його до a[i + 1 ... j]. Знаходимо максимум серед вартостей усіх розглянутих хороших інтервалів.

Приклад

Розглянемо рух вказівників для наведеного прикладу.

  1. i = 0, j рухається вперед, доки сума чисел на інтервалі не більше m = 12. Зупинимося на інтервалі , оскільки на ньому сума дорівнює , а на інтервалі сума дорівнює .

  2. i = 1, j вперед посунути не можемо, оскільки сума на інтервалі дорівнює .

  3. 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)