Проблема

В них N мешочков с бриллиантами. i-й из этих мешков содержит A[i]алмазов. Если вы уроните сумку с алмазами A[i], она изменится на A[i]/2алмазов, а вы получите A[i]. бриллианты. Сбрасывание сумки занимает 1 минуту. Найдите максимальное количество алмазов, которое вы можете получить, если вам дается K минут.

Пример 1:

Input:
N = 5, K = 3
A[] = {2, 1, 7, 4, 2}
Output:
14
Explanation:
The state of bags is:
2 1 7 4 2
You take all diamonds from Third bag (7).
The state of bags becomes: 2 1 3 4 2 
Take all diamonds from Fourth bag (4).
The state of bags becomes: 2 1 3 2 2
Take all diamonds from Third bag (3).
The state of bags becomes: 2 1 1 2 2 
Hence, number of Diamonds = 7+4+3 = 14.

Подход

Мы должны бросать K раз, и каждый раз это будет половина счета.

Поскольку нам нужно максимизировать результат, мы выберем K самых высоких бриллиантов.

Ex: [2, 1, 7, 4, 2]

Итак, мы можем выбрать 7, теперь это [2, 1, 3, 4, 2]

теперь мы можем выбрать 4, теперь это [2, 1, 3, 2, 2]

теперь мы можем выбрать 3, теперь это [2, 1, 1, 2, 2]

так что в 3 раза всего будет 7 + 4 + 3 = 14.

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

Итак, мы знаем, что здесь PriorityQueue может быть лучшим вариантом, поскольку он может вставлять новый элемент за O(logN) и удалять верхний элемент за O(logN).

Код

Джава

class Solution {
    static long maxDiamonds(int[] A, int N, int K) {
        // code here
        long result = 0l;
        PriorityQueue<Integer> pq = new PriorityQueue<>((p1, p2) -> p2-p1);
        for(int x: A) pq.add(x);
        while(K-- > 0) {
            int poll = pq.poll();
            result += (long)(poll);
            pq.add(poll/2);
        }
        return result;
    }
};

Сложность времени

O(NlogN)

Вставка всех элементов в приоритетную очередь займет O(NlogN).

Тогда для извлечения K элементов потребуется O(KlogN).

Снова вставка этих элементов K займет O (KlogN).

Итого => O(NlogN) + O(KlogN) + O(KlogN) => O(NlogN)

Космическая сложность

O(N) для приоритетной очереди

Вот и все !