-
Автор темы
- #1
Задача: Сушка
Тётя Люба только что постирала всё белье - n вещей - и теперь перед ней стоит непростая задача - как его высушить за минимальное время. Сразу после стирки, i-я постиранная вещь имеет влажность ai. Если она сушится на веревке, то за минуту ее влажность уменьшается на 1, а если на батарее - то на k (если влажность была меньше k, то она становится равной 0).
Причем веревок у тёти Любы много (хватает для одновременной сушки всех вещей), а батарея только одна, причем такая маленькая, что на ней нельзя сушить две вещи одновременно. Тётя Люба может может каждую минуту выбрать ровно одну вещь и повесить ее сушиться на батарею. За какое минимальное время она сможет высушить все вещи?
Входные данные
Первая строка содержит число n (1 <= n <= 100000). Вторая строка содержит числа ai (1 <= ai <= 10e9). Третья строка содержит число k (1 <= k <= 1e9).
Выходные данные
Выведите одно число - минимальное число минут, за которые можно высушить все вещи.
Примеры
Файл с решением задачи на C++:
Сложность алгоритма - O(66N + NlogN).
Идея алгоритма:
Тётя Люба только что постирала всё белье - n вещей - и теперь перед ней стоит непростая задача - как его высушить за минимальное время. Сразу после стирки, i-я постиранная вещь имеет влажность ai. Если она сушится на веревке, то за минуту ее влажность уменьшается на 1, а если на батарее - то на k (если влажность была меньше k, то она становится равной 0).
Причем веревок у тёти Любы много (хватает для одновременной сушки всех вещей), а батарея только одна, причем такая маленькая, что на ней нельзя сушить две вещи одновременно. Тётя Люба может может каждую минуту выбрать ровно одну вещь и повесить ее сушиться на батарею. За какое минимальное время она сможет высушить все вещи?
Входные данные
Первая строка содержит число n (1 <= n <= 100000). Вторая строка содержит числа ai (1 <= ai <= 10e9). Третья строка содержит число k (1 <= k <= 1e9).
Выходные данные
Выведите одно число - минимальное число минут, за которые можно высушить все вещи.
Примеры
Ввод | Вывод |
---|---|
3 2 3 9 5 | 3 |
3 2 3 6 5 | 2 |
Файл с решением задачи на C++:
Пожалуйста, авторизуйтесь для просмотра ссылки.
.Сложность алгоритма - O(66N + NlogN).
Идея алгоритма:
Основополагающим действием будет выбор элемента для вычитания из него K. Думаю, не нужно объяснять, почему самым оптимальным будет всегда использовать максимум, а после его изменения уже изменять его положение в массиве. Самым наивным решением был бы честный подсчет каждого элемента, но тогда сложность алгоритма уходит в N^2, что явно не будет заходить для n = 10^5. Предлагаю оставить идею тривиального решения и добавить несколько оптимизаций:
1) Отсортировать лучше Radix'ом, тогда сложность сортировки составит V*N.
2) У нас нет необходимости знать промежуточные значения каждого элемента. Достаточно помнить, что из каждого, кроме последнего, мы вычтем i единиц на i'м шаге. Остается только сделать проверку на a[k] == i, после мы будем удалять этот элемент из массива вещей mas.
С последним элементом немного сложнее. Чтобы облегчить свою жизнь, предлагаю считать, что из него мы тоже вычитали i-1 единиц до i-го этапа. Для 0го i это никак не повлияет, но потом для соблюдения условия необходимо прибавлять i к новому значению максимума (последнего элемента) и вставлять его в массив с помощью бинпоиска.