Нехай — найбільше значення серед усіх a_i. Очевидно, що через max хвилин уся білизна висохне самостійно, навіть без використання радіатора.
Нехай відповідь дорівнює . Це означає, що вся білизна, яка містить не більше одиниць води, встигне висохнути природним шляхом. А речі, в яких води більше , потрібно додатково сушити на радіаторі.
Будемо вважати, що кожна річ втрачає по одній одиниці води на хвилину, незалежно від того, знаходиться вона на радіаторі чи ні. Якщо ж річ кладуть на радіатор, то вона втрачає додатково ще k - 1 одиниць води на хвилину, тобто всього одиниць на хвилину.
Якщо для сушки всіх речей достатньо хвилин, то кожну річ з a_i > m необхідно додатково сушити на радіаторі. Обсяг води, який не встигне випаруватися природним шляхом, становить a_i - m. За одну хвилину радіатор видаляє додатково (k - 1) одиниць води, тому на таку річ потрібно
хвилин радіаторного часу.
Сумарна кількість хвилин \displaystyle \sum_{i=1}^n \lceil (a_i - m) / (k - 1) \rceil використання радіатора не повинна перевищувати , оскільки в кожну хвилину можна сушити лише одну річ. Підсумовування береться по всіх індексах , для яких a_i > m.
Таким чином, перевірка здійснюється наступним чином: якщо для заданого загальна кількість необхідних хвилин сушки на радіаторі не перевищує , то значення допустиме. Найменше підходяще значення ми шукаємо за допомогою бінарного пошуку.
Приклад
Спочатку є три речі з кількістю води (2, 3, 9).
У першу хвилину кладемо третю річ на радіатор. Після цього отримуємо: (1, 2, 4).
У другу хвилину знову кладемо третю річ на радіатор. Стан стає (0, 1, 0).
На третій хвилині друга річ висихає сама. Кінцевий стан: (0, 0, 0).
Розглянемо значення m = 2. Тоді всі речі, що містять не більше одиниць води, висохнуть самі.
Для решти потрібна сушка на радіаторі. Друга річ містить одиниці води, отже, на радіаторі потрібно видалити 3 - 2 = 1 одиницю.
Третя річ містить одиниць, тому на радіаторі потрібно видалити 9 - 2 = 7 одиниць води.
На це потрібно \lceil 1/4 \rceil + \lceil 7/4 \rceil = 3 хвилини. Це більше ніж m = 2. Отже, двох хвилин недостатньо.
Реалізація алгоритму
Оголошуємо робочий масив.
#define MAX 100001
int a[MAX];Читаємо вхідні дані.
scanf("%d",&n);
for(i = 0; i < n; i++) scanf("%d",&a[i]);
scanf("%d",&k);За хвилин вся білизна обов'язково висохне, навіть без використання радіатора.
l = 0; r = *max_element(a,a+n);Якщо k \le 1, то сушка з використанням радіатора еквівалентна природній сушці, і радіатор не дає жодної переваги.
if (k <= 1)
{
printf("%d\n",r); return 0;
}Шукане мінімальне число хвилин m можна знайти бінарним пошуком на відрізку [l; r].
while (r - l > 1)
{
m = (r + l) / 2;Змінна накопичує загальну кількість хвилин, протягом яких потрібно використовувати радіатор. При цьому за хвилин слід висушити всю білизну.
dry = 0;
for (i = 0; i < n; i++)
{
if (a[i] > m)
dry += (a[i] - m + k - 2) / (k - 1);
if (dry > m) break;
}
if (dry > m) l = m; else r = m;
}Виводимо відповідь.
printf("%d\n",r);