You are given an integer array gifts denoting the number of gifts in various piles. Every second, you do the following:
Return the number of gifts remaining after k seconds.
Example 1:
Input: gifts = [25,64,9,4,100], k = 4 Output: 29 Explanation: The gifts are taken in the following way: - In the first second, the last pile is chosen and 10 gifts are left behind. - Then the second pile is chosen and 8 gifts are left behind. - After that the first pile is chosen and 5 gifts are left behind. - Finally, the last pile is chosen again and 3 gifts are left behind. The final remaining gifts are [5,8,9,4,3], so the total number of gifts remaining is 29.
Example 2:
Input: gifts = [1,1,1,1], k = 4 Output: 4 Explanation: In this case, regardless which pile you choose, you have to leave behind 1 gift in each pile. That is, you can't take any pile with you. So, the total gifts remaining are 4.
Constraints:
1 <= gifts.length <= 1031 <= gifts[i] <= 1091 <= k <= 103class Solution {
public:
long long pickGifts(vector<int>& gifts, int k) {
priority_queue <long long> pq;
long long res=0;
for(auto g: gifts)
pq.push(g);
while(k--)
pq.push(floor(sqrt(pq.top()))), pq.pop();
while(!pq.empty())
res += pq.top(), pq.pop();
return res;
}
};class Solution {
public long pickGifts(int[] gifts, int k) {
Queue<Integer> pq = new PriorityQueue<>((a, b)->b-a);
long total = 0;
for(int g: gifts){
pq.offer(g);
total += g;
}
for(int i=0; i<k; i++){
int top = pq.poll();
int newVal = (int)Math.sqrt(top);
total -= top - newVal;
pq.offer(newVal);
}
return total;
}
}