проблем

Вътре има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).

Код

Java

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) за приоритетна опашка

Това е всичко !