Подсчитайте максимальное количество гигантов, которых можно уничтожить, прежде чем они достигнут города.

Опубликовано: 22 Сентября, 2022

Даны два массива dist[] и speed[] , состоящие из N целых чисел, где dist[i] — начальное расстояние i -го гиганта от города, а speed[i] — скорость i -го гиганта. Каждую минуту можно уничтожить одного великана. Следовательно, в любой момент времени t можно убить не более t гигантов. Если большее количество великанов сможет добраться до города за время t , то игра окончена. Задача состоит в том, чтобы найти максимальное количество великанов, которое можно уничтожить до проигрыша, или N , если всех великанов можно уничтожить до того, как они достигнут города.

Примеры:

Input: dist[] = [1, 3, 4], speed[] = [1, 1, 1]
Output: 3
Explanation: At the start of minute 0, the distances of the  giants are [1, 3, 4]. The first giant is eliminated.
At the start of 1st minute, the distances of the giants are [X, 2, 3]. No giant is eliminated.
At the start of 2nd minute, the distances of the giants are [X, 1, 2]. The second giant is eliminated.
At the start of 3rd minute, the distances of the giants are [X, X, 1]. The third  giant is eliminated.
All 3  giants can be eliminated.

Input: dist[] = [1, 1, 2, 3], speed[] = [1, 1, 1, 1]
Output: 1

Подход: Идея состоит в том, чтобы использовать жадный подход для решения проблемы. Найдите время, за которое каждый великан войдет в город, и постарайтесь уничтожить великана с наименьшим возможным временем приближения. Выполните следующие шаги, чтобы решить проблему:

  • Инициализируйте векторный часовой пояс[] для хранения времени.
  • Переберите диапазон [0, N], используя переменную i , и выполните следующие шаги:
    • Поместите значение dist[i]/speed[i] в векторный часовой пояс[].
  • Отсортируйте векторный часовой пояс[] в порядке возрастания.
  • Инициализируйте переменные curr_time как 0 , чтобы сохранить текущее время, и killcount как 0 , чтобы сохранить количество убитых гигантов.
  • Переберите диапазон [0, N], используя переменную i , и выполните следующие шаги:
    • Если timezone[i] меньше, чем curr_time , цикл разорвется.
    • В противном случае увеличьте количество curr_time и killcount на 1.
  • После выполнения вышеуказанных шагов верните в качестве ответа значение killcount .

Ниже приведена реализация описанного выше подхода.


Временная сложность: O(N * log(N))
Вспомогательное пространство: O(N)